Привет, я новичок в sql, и я не могу найти хороший способ решить проблему. У меня есть следующие объекты
passengers (`id` INT, `name` VARCHAR(45), `surname` VARCHAR(45),
`year_of_birth` INT)
flights (`id` INT, `routes_id` INT, `date` DATE, `airplanes_id` INT)
flights_has_passengers (`flights_id` INT, `passengers_id` INT)
airplanes (`id` INT, `number` VARCHAR(45), `manufacturer`
VARCHAR(45), `model` VARCHAR(45)).
Я хочу создать скрипт, который находит имена всех пассажиров, которые сели хотя бы на один рейс, и если они сели более чем на один рейс, эти рейсы должны быть выполнены с использованием одного и того же самолета. Я попытался вернуть кортеж, содержащий самолеты, который использовал каждый из пассажиров, используя вложенный запрос. Затем я попытался использовать оператор all, чтобы проверить, является ли каждая запись в типе одинаковой. Однако мне не повезло. Любой совет будет оценен.
Обновлено: я подумал о следующем решении, но не знаю, правильно ли оно:
select p1.name, p1.surname
from passengers p1, airplanes a1, flights_has_passengers, flights
where
p1.id = flights_has_passengers.passengers_id and
flights_has_passengers.flights_id = flights.id and
flights.airplanes_id = a1.id
group by p1.id
having count(a1.id) = 1;
ОБНОВЛЕНИЕ: основываясь на комментарии OP к ответу, вот еще один способ использования НЕ СУЩЕСТВУЕТ
Hey thanks for your answer.Is there another way to implement this without a join statement ?For example something like not exists or all ?
select p.id
from passengers p
join flights_has_passengers fp
on p.id= fp.passengers_id
join flights f
on f.id=fp.flights_id
where not exists
(select 1 from join flights f1
where f1.id=f.id
and f1.airplanes_id<>f.airplanes_id)
Возможно, используйте JOIN, как показано ниже.
select p.id
from passengers p
join flights_has_passengers fp
on p.id= fp.passengers_id
join flights f
on f.id=fp.flights_id
group by p.id
having count(f.airplanes_id)=1
@ChrisMaurer правильно, я добавил это на всякий случай.
@DhruvJoshi Эй, спасибо за ваш ответ. Есть ли другой способ реализовать это без оператора соединения? Например, что-то вроде не существует или все?
Ответ @AlexandrosS обновлен
Обратите внимание: если вас интересует только идентификатор пассажира, вам даже не нужно присоединяться к таблице пассажиров.