MySQL 复杂的排除查询



我有一堆文章

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

和产品组:

+-----------+--------------+
| 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              |
+-----------+----------------+

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

但这似乎非常复杂和烦人,因为我经常在这里和那里有这种szenario。

我不能使用 WHERE 产品组 ID 不在 (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);

用简单的英语阅读,上面的查询说返回我们在与ProductGroupID = 4关联的链接表中找不到条目的文章名称。

最新更新