Ваш вопрос действительно трудно понять;вы, кажется, на самом деле не заявили, что вы хотите в последовательной и последовательной манере.Из прочтения комментариев кажется, что вы хотели бы знать:
Самое дальнее, что может летать каждый пилот (который рассчитан на 3 или более самолетов).
Таким образом, вы ожидаете списокEID пилотов и максимальная дальность полета (из таблицы самолетов) по всем самолетам, которые пилот может летать.Пилот должен иметь возможность летать как минимум на 3 самолетах.
Шаги:
Составить список пилотов и расстояния, на которые может рассчитывать самолет, на который они рассчитаны:
SELECT c.EID, a.cruising_range
FROM certified c INNER JOIN aircrafts a ON c.AID = a.AID
Улучшение запроса для подсчета рейтингов и максимальной дальности полета на пилота (пилот может летать на самолете, у самолета есть дальность, поэтому, когда пилот летит на самолете, у пилота есть диапазон):
SELECT c.EID, COUNT(*) as count_ratings, MAX(a.cruising_range) max_range
FROM certified c INNER JOIN aircrafts a ON c.AID = a.AID
GROUP BY c.EID --per pilot
Улучшите запрос, чтобы выбрать только пилотов, которые могут летать как минимум на 3 самолетах:
SELECT c.EID, max_range FROM
(
SELECT c.EID, COUNT(*) as count_ratings, MAX(a.cruising_range) max_range
FROM certified c INNER JOIN aircrafts a ON c.AID = a.AID
GROUP BY c.EID --per pilot
) pilot_ranges
WHERE
pilot_ranges.count_ratings >= 3
Я мог бы использовать HAVING:
SELECT c.EID, MAX(a.cruising_range) max_range
FROM certified c INNER JOIN aircrafts a ON c.AID = a.AID
GROUP BY c.EID
HAVING COUNT(*) >= 3
Но иногда есть преимуществов визуальном размещении запроса в виде набора шагов, а не попыток сделать все сразу, и использования подзапросов для мысленного формирования списка данных, а затем его изменения, фильтрации,добавить к этому .. все поэтапно.
Оптимизатор запросов, скорее всего, перезапишет эти запросы внутренне, чтобы они в конечном итоге выполнялись одинаково, так что выгода для человека в понимании и будущем обслуживании
Редактировать: вот запрос, который перечисляет EIDи AID для каждой комбинации пилот-самолет, где пилот способен летать на 3+ самолетах:
SELECT c.EID, a.AID FROM
(
SELECT c.EID
FROM certified c
GROUP BY c.EID
HAVING count(*) >= 3
) find_pilots_can_fly_atleast_three
INNER JOIN certified c ON c.EID = find_pilots_can_fly_atleast_three.EID
INNER JOIN aircrafts a ON c.AID = a.AID
Сначала вы генерируете список интересных пилотов - это подзапрос find_pilots_can_fly_atleast_three
, затем мы присоединяемсяэти данные обратно на сертифицированные и самолеты.В итоге мы получаем список пилотов, которые могут летать на 3 самолетах, и получаем подробную информацию о самолетах
Возможно, вы пытались сделать слишком много за один раз.Когда вы группируете, вы теряете определенные биты данных.При группировании пилотов, чтобы найти тех, кто может управлять самолетами 3+, мы ДОЛЖНЫ потерять идентификатор самолета и сохранить только идентификатор пилота.Если вы попытаетесь сохранить идентификационный номер самолета (потому что вы этого хотите), вы получите группы, у которых будет только 1, потому что каждая комбинация пилот-самолет уникальна.Таким образом, мы теряем идентификатор самолета в агрегацию (счет) и сохраняем идентификатор пилота.Это помогает нам узнать, сколько самолетов может летать каждый пилот.Чтобы выяснить , какие самолеты могут летать эти пилоты, мы ДОЛЖНЫ затем присоединить этот идентификатор пилота из запроса «найти 3+» обратно к списку самолетов-пилотов (сертифицированная таблица), чтобы развернуть его обратно в список.пилотов с самолетом
Всегда помните, что вам разрешено присоединять стол к себе, и это действительно важно в подобных случаях.Если у вас была таблица, полная адресов с датами, когда вы проживали по этому адресу, чтобы найти самый последний, у вас был бы запрос, получивший your_id, max(lived_there_until_date
, но вы не можете сохранить другие данные об адресе - вы хотите, чтобыдата самой последней записи. А затем, если вы действительно хотите, чтобы оставшиеся данные из этой последней строки присоединялись к только что выполненному запросу, к таблице адресов, чтобы получить всю строку с самой последней датой alive_there_until