Я пытаюсь получить данные о 5 лучших клиентах в системе бронирования на железной дороге. Чтобы получить это, я попытался получить максимальное значение, суммируя их тариф каждый раз, когда они делают заказ. Вот код.
SELECT c. firstName, c.lastName,MAX(r.totalFare) as Fare
FROM customer c, Reservation r, books b
WHERE r.resID = b.resID
AND c.username = b.username
AND r.totalfare < (SELECT sum(r1.totalfare) Revenue
from Reservation r1, for_res f1, customer c1,books b1
where r1.resID = f1.resID
and c1.username = b1.username
and r1.resID = b1.resID
group by c1.username
)
GROUP BY c.firstName, c.lastName, r.totalfare
ORDER BY r.totalfare desc
LIMIT 5;
это выдает ошибку: [21000][1242] Подзапрос возвращает более 1 строки
Если я удалю группу из подзапроса, результат будет: (это табличная форма)
Jade,Smith,1450
Jade,Smith,725
Jade,Smith,25.5
Monica,Geller,20.1
Rach,Jones,10.53
Но это не то, чего я хочу, как видите, я хочу добавить имя «Джейд» к общей стоимости проезда.
Я просто не вижу смысла в подзапросе. Кажется, что вы можете получить желаемый результат с sum()
select c.firstname, c.lastname, sum(totalfare) as totalfare
from customer c
inner join books b on b.username = c.username
inner join reservation r on r.resid = b.resid
group by c.username
order by totalfare desc
limit 5
Это суммирует все резервирования каждого клиента и использует эту информацию для сортировки результатов. Это гарантирует одну строку для каждого клиента.
Запрос предполагает, что username
является первичным ключом таблицы customer
. Если это не так, вам нужно добавить столбцы firstname
и lastname
в предложение group by
.
Обратите внимание, что здесь используются стандартные соединения (с ключевыми словами inner join ... on
), а не неявные соединения старой школы (с запятыми в предложении from
: это устаревший синтаксис, который не следует использовать в новом коде.