Как я могу исключить строку в запросе выбора SQL, которая имеет отношение многие ко многим? - PullRequest
1 голос
/ 20 сентября 2019

У меня есть три таблицы, в том числе таблица соединения многих ко многим.

Таблица 1: события

+-------------------------+
| EventID | eventName     |
+-------------------------+
| 1       | Backyard BBQ  |
| 2       | Night Out     |
| 3       | Birthday Party|
+-------------------------+

Таблица 2: тип события

+-----------------------+
| typeID | typeName     |
+-----------------------+
| 1       | BBQ         |
| 2       | Happy Hour  |
| 3       | House Party |
+-----------------------+

Таблица 3: событие_типа

+---------------------------+
| joinID | eventID | typeID |
+---------------------------+
| 1      | 1       | 1      |
| 2      | 1       | 3      |
| 2      | 2       | 2      |
| 3      | 3       | 3      |
+---------------------------+

Как мне написатьОператор выбора SQL для получения всех событий, которые не имеют typeID = 3 - «домашняя вечеринка»?

ПРИМЕЧАНИЕ. Событие может быть связано с несколькими типами событий, поскольку EventID 1 является одновременно барбекю и домашней вечеринкой,

Результат, который я ищу, будет иметь только событие "Night Out".

Поскольку я добавляю больше событий и типов событий, я бы хотел иметь возможность ограничивать несколько типов событий

Я играл с различными операторами выбора и не могу понять, как удалить или исключить строку, имеющую отношение с одним из объединений.

Iценю твою помощь.

1 Ответ

0 голосов
/ 20 сентября 2019

Используйте условие NOT EXISTS с коррелированным подзапросом:

SELECT e.*
FROM events e
WHERE NOT EXISTS (
    SELECT 1
    FROM event_type_join etj
    WHERE etj.typeID = 3 AND etj.eventID = e.eventID 
)

Условие NOT EXISTS обеспечивает отсутствие записи в таблице соединений с typeID = 3 для текущего события.

Примечание: поскольку вы уже знаете typeID типов событий, которых хотите избежать, вам не нужно включать в запрос таблицу event_type.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...