MySQL сложный запрос исключения - PullRequest
0 голосов
/ 17 июня 2020

У меня есть куча статей

+-----------+-------+
| ArticleID | Name  |
+-----------+-------+
| 1         | Bla   |
| 2         | Blub  |
| 3         | Test  |
+-----------+-------+

И Prodcutgroups:

+-----------+--------------+
| ProductGroupID | Name    |
+-----------+--------------+
| 4              | Group A |
| 5              | Group B |
| 6              | Group C |
+-----------+--------------+

И таблица ссылок (отношение M: N), которая связывает статьи с группами продуктов. Каждая статья может быть во многих товарных группах одновременно, но только один раз для каждой группы:

+-----------+----------------+
| ArticleID | ProductGroupID |
+-----------+----------------+
| 1         | 4              |
| 1         | 5              |
| 2         | 5              |
| 2         | 6              |
| 3         | 4              |
| 3         | 6              |
+-----------+----------------+

Моя проблема теперь в том, что мне нужен запрос, который позволяет мне найти статьи, которые ОТСУТСТВУЮТ в группе товаров. с идентификатором 4. Обычно я бы написал сценарий PHP, который просматривает всю таблицу, проверяет значения и запоминает, не был ли найден идентификатор группы товаров 4.

Но это кажется очень сложным и раздражающим, поскольку у меня такого рода сценарии чаще встречаются здесь и там.

Я не могу использовать WHERE ProductGroupID NOT IN (4), потому что, когда статья назначается ДРУГИМ группам продуктов, она обнаружит эти строки, и результат НЕ скажет мне, что статья находится в этой группе c или нет.

Результат нужно было бы дать только мне !! Идентификатор статьи: 2, поскольку его нет в группе продуктов с идентификатором 4

Я благодарен за любой полезный совет!

1 Ответ

0 голосов
/ 17 июня 2020

Один из вариантов, с использованием exists logi c:

SELECT a.Name
FROM articles a
WHERE NOT EXISTS (SELECT 1 FROM link l
                  WHERE l.ArticleID = a.ArticleID AND l.ProductGroupID = 4);

Читать на простом английском sh, в приведенном выше запросе говорится, что нужно вернуть имя статьи, для которой мы не можем найти запись в ссылке таблица, связанная с ProductGroupID = 4.

...