MySQL选择多对多的地方

7 mysql sql many-to-many

我遇到SQL查询问题.我的架构描述了很多在文章之间多对多的关系articles表和类别在categories表-与中间表article_category它有一个id,article_idcategory_id场.

我想选择所有只有id 1和类别的文章2.不幸的是,此查询还将选择除了任何其他类别之外还具有这些类别的任何文章.

例如,这是SQL的示例输出(为了描述目的,显示了类别).您可以看到,当查询选择了ID为的文章时10,它还选择了具有id的文章,11尽管有一个额外的类别.

+-------+------------+
| id    | categories |
+-------+------------+
| 10    | 1,2        |
| 11    | 1,2,3      |
+-------+------------+
Run Code Online (Sandbox Code Playgroud)

这是我想通过选择只有类别1和的文章来实现的输出2.

+-------+------------+
| id    | categories |
+-------+------------+
| 10    | 1,2        |
+-------+------------+
Run Code Online (Sandbox Code Playgroud)

同样的,这就是我想要的选择,只有类的文章来实现输出1,23.

+-------+------------+
| id    | categories |
+-------+------------+
| 11    | 1,2,3      |
+-------+------------+
Run Code Online (Sandbox Code Playgroud)

这是我写的SQL.为实现上述目标,我缺少什么?

SELECT articles.id
FROM articles
WHERE EXISTS (
    SELECT 1
    FROM article_category
    WHERE articles.id = article_id AND category_id IN (1,2)
    GROUP BY article_id
)
Run Code Online (Sandbox Code Playgroud)

非常感谢!

gwc*_*gwc 3

假设您想要的不仅仅是文章的 id:

SELECT a.id
      ,a.other_stuff
  FROM articles a
  JOIN article_category ac
    ON ac.article_id = a.id
GROUP BY a.id
HAVING GROUP_CONCAT(DISTINCT ac.category_id ORDER BY ac.category_id SEPARATOR ',') = '1,2'
Run Code Online (Sandbox Code Playgroud)

如果您想要的只是文章的 id,请尝试以下操作:

SELECT article_id
  FROM article_category 
GROUP BY article_id
HAVING GROUP_CONCAT(DISTINCT category_id ORDER BY category_id SEPARATOR ',') = '1,2'
Run Code Online (Sandbox Code Playgroud)

请访问http://sqlfiddle.com/#!2/9d213/4查看其实际情况

还应该补充的是,这种方法的优点是它可以支持检查任意数量的类别,而无需更改查询。只需将“1,2”设置为字符串变量并更改传递到查询中的内容即可。因此,您可以通过传递字符串“1,2,7”轻松搜索类别 1、2 和 7 的文章。不需要额外的连接。