Задача номер 16. Вывести отсортированный по количеству перелетов (по убыванию) и имени (по возрастанию) список пассажиров, совершивших хотя бы 1 полет. Задачка интересна тем, что в ней есть ошибка в онлайн-тренажере. Для начала - как бы я решал эту задачу. Запрос несложный, но... неправильный!
SELECT p.name, COUNT(DISTINCT pit.trip) AS count FROM Pass_in_trip AS pit JOIN Passenger AS p ON p.id = pit.passenger GROUP BY p.id ORDER BY count DESC, p.name ASC В разборе задачи №5 я писал, что COUNT(DISTINCT id) лучше, чем COUNT(*), т.к. помогает в том числе избежать дублей при джоинах. В текущей задаче дублей при джойнах не наблюдается, но все равно пример показательный. Видим, что для пассажира 'Michael Caine' COUNT(DISTINCT trip) дал результат 3, а COUNT(*) = 4. Лезем дальше в таблицы. Пропускаю этап, где я определил, что id этого пассажира Passenger.id = 14 и что мы видим по нему в таблице Pass_in_trip? Видим, что на одном рейсе 7771 он купил 2 места! Поэтому COUNT(DISTINCT trip) = 3,