Как сделать корректный запрос в sql?

Таблица

Задача получить названия самолетов которые летали и в Ростов и в Париж делаю так:

SELECT plane FROM trip WHERE town_from = 'Rostov' AND town_from = 'London';

ожидаю получить: Boeing (только он летал и туда и туда)

Но в ответ пусто. Что не так?


Ответы (3 шт):

Автор решения: Miron

Предложу следующий способ:

SELECT 
    plane
FROM
    trips as t
GROUP BY plane
HAVING
    exists(
        SELECT
            *
        FROM
            trips
        WHERE
            plane = t.plane
            AND
            town_to = "Rostov"
    )
    AND
    exists(
        SELECT
            *
        FROM
            trips
        WHERE
            plane = t.plane
            AND
            town_to = "Paris"
    )
→ Ссылка
Автор решения: Spyinfo
SELECT * 
       FROM trip 
       WHERE town_from = 'Rostov' OR town_from = 'London';
→ Ссылка
Автор решения: Miron

Есть и еще один способ. От прошлого он отличается тем, что вы можете не копировать каждый раз огромную конструкцию exists для добавления нового города. Вам достаточно лишь создать временную таблицу(кратко - таблица существует до закрытия соединения. После использования можно ее вручную удалить, чтобы не висела до закрытия соединения):

CREATE TEMPORARY TABLE towns_to(
    id INT primary key not null auto_increment,
    name VARCHAR(23)
);

Туда можно поместить все города, в которые должен был слетать самолет:

INSERT INTO towns_to
(name)
VALUES
    ("Paris"),
    ("Rostov");

Тогда запрос будет выглядеть так(использовал трюк для проверки, является ли одно множество подмножеством другого):

SELECT 
    plane
FROM
    trips as t
GROUP BY plane
HAVING
    not exists(
        SELECT
            *
        FROM
            towns_to
        LEFT JOIN 
            (
            SELECT
                *
            FROM
                trips
            WHERE
                plane = t.plane
            ) as _set
        ON
            towns_to.name = _set.town_to
        WHERE
            _set.town_to is NULL
    );

Вместо временной таблицы можно использовать таблицу, созданную в самом запросе. Но это очень новая фича, она появилась в версии MySQL 8.0.19(2020.01.13(!!!)). Но если заходите использовать - просто замените FROM towns_to на FROM + строка с созданием такой таблицы. Сам не пробовал, но должно работать.

→ Ссылка