Задача по SQL - Join + Where(Having) + Group By

263
23 апреля 2022, 09:50

Вывести отсортированный по количеству перелетов (по убыванию) список пассажиров, совершивших хотя бы 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

Не понимаю в чем ошибка. Система говорит, что решение не верное, хотя мне кажется, что все верно.

Answer 1

Верным решением будет такой простой запрос (на 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

Не верно группировать только по имени пассажира, так как у разных людей имена могут совпадать, надо по идентификатору и имени.

Answer 2
Where
  trip >= 1

Pass_in_trip.trip соответствует полю Trip.id, т.е. вы проверяете тут, что id некоего перелёта в таблице перелётов >= 1, а вовсе не число перелётов конкретного пассажира, как вы думаете.

Answer 3

Вот это правильный запрос. Не надо джоинить таблицу 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;

Answer 4

У меня получился чуть более лаконичный ответ:

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 рейс, так что не нужно делать допонительные проверки и джоинить другие таблицы.

Answer 5
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
Answer 6
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
READ ALSO
выбрать строку по значению столбца mysql

выбрать строку по значению столбца mysql

Имеется простейшей структуры БД:

233
MySQL запрос как оптимизировать?

MySQL запрос как оптимизировать?

Хотелось бы узнать, возможно ли оптимизировать данный запрос ?

231