Вывести отсортированный по количеству перелетов (по убыванию) список пассажиров, совершивших хотя бы 1 полет.
Поля в результирующей таблице: name, count
Ссылка на задачу - https://sql-academy.org/ru/trainer/tasks/16
Попытка решения
SELECT name, COUNT(trip) as count
FROM
Passenger
JOIN Pass_in_trip on Passenger.id = Pass_in_trip.passenger
Where
trip >= 1
GROUP
BY name
ORDER BY count DESC
Не понимаю в чем ошибка. Система говорит, что решение не верное, хотя мне кажется, что все верно.
Верным решением будет такой простой запрос (на db<>fiddle):
SELECT name, COUNT(*) as count
FROM Passenger
JOIN Pass_in_trip on Pass_in_trip.passenger = Passenger.id
JOIN Trip on Trip.id = Pass_in_trip.trip and Trip.time_out <= now()
GROUP BY Passenger.id, Passenger.name
HAVING COUNT(*) >= 1
ORDER BY count DESC
Не верно группировать только по имени пассажира, так как у разных людей имена могут совпадать, надо по идентификатору и имени.
Where
trip >= 1
Pass_in_trip.trip
соответствует полю Trip.id
, т.е. вы проверяете тут, что id
некоего перелёта в таблице перелётов >= 1, а вовсе не число перелётов конкретного пассажира, как вы думаете.
Вот это правильный запрос. Не надо джоинить таблицу Trip
SELECT DISTINCT name, COUNT(Pass_in_trip.trip) as count FROM Passenger
LEFT JOIN Pass_in_trip ON Passenger.id = Pass_in_trip.passenger
GROUP BY Passenger.id HAVING count >= "1"
ORDER BY count DESC;
У меня получился чуть более лаконичный ответ:
SELECT name, COUNT(name) as count from Passenger
INNER JOIN Pass_in_trip ON Passenger.id = Pass_in_trip.passenger
GROUP BY Passenger.id
ORDER BY count DESC
В таблице Pass_in_trip
уже только те пассажиры у которых был хоть 1 рейс, так что не нужно делать допонительные проверки и джоинить другие таблицы.
SELECT name, COUNT(name) as count FROM Passenger, Pass_in_trip
WHERE Pass_in_trip.passenger= Passenger.id
GROUP BY name HAVING COUNT(count) >= 1
ORDER BY count DESC
SELECT name,COUNT(Trip.id) as count
FROM Passenger
JOIN Pass_in_trip ON Passenger.id=Pass_in_trip.passenger
JOIN Trip on Trip.id=Pass_in_trip.trip
GROUP BY Passenger.name
HAVING COUNT(Trip.id)>=1
ORDER BY count desc,name ASC
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab