MySQL 复杂的排除查询

MySQL complicated exclude query

我有一堆文章

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

和产品组:

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

还有 link table(M:N 关系)links 文章与产品组。每篇文章可以同时出现在多个产品组中,但每个组只能出现一次:

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

我现在的问题是我需要一个查询来找出 ID 为 4 的产品组中缺少的文章。 通常我会写一个 PHP 脚本来循环整个 table 并检查值并记住是否找不到 product-group-id 4。

但这似乎非常复杂和烦人,因为我经常遇到这种情况。

我不能使用 WHERE ProductGroupID NOT IN(4) 因为当文章被分配给其他产品组时它会发现行和 结果不会告诉我这篇文章是否在这个特定的组中。

结果只需要给我!!文章 ID:2,因为它不在 ID 为 4

的产品组中

感谢任何有用的建议!

一个选项,使用存在的逻辑:

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

用简单的英语阅读,上面的查询告诉 return 我们在与 ProductGroupID = 4 关联的 link table 中找不到条目的文章名称.