gpt4 book ai didi

MySQL选择多对多位置

转载 作者:可可西里 更新时间:2023-11-01 06:37:33 24 4
gpt4 key购买 nike

我在使用 SQL 查询时遇到问题。我的模式描述了 articles 表中的文章与 categories 表中的类别之间的多对多关系 - 中间表 article_category idarticle_idcategory_id 字段。

我想选择所有只有 ID 为 12 的类别的文章。不幸的是,此查询还将选择具有这些类别的任何文章以及任何其他文章。

例如,这是 SQL 的示例输出(出于描述目的显示类别)。您可以看到,虽然查询选择了 ID 为 10 的文章,但它也选择了 ID 为 11 的文章,尽管它有一个额外的类别。

+-------+------------+
| id | categories |
+-------+------------+
| 10 | 1,2 |
| 11 | 1,2,3 |
+-------+------------+

这是我希望通过选择仅包含类别 12 的文章来实现的输出。

+-------+------------+
| id | categories |
+-------+------------+
| 10 | 1,2 |
+-------+------------+

同样,这是我希望通过选择仅包含类别 123 的文章来实现的输出。

+-------+------------+
| id | categories |
+-------+------------+
| 11 | 1,2,3 |
+-------+------------+

这是我写的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
)

非常感谢!

最佳答案

假设您想要的不仅仅是文章的 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'

如果您只需要文章的 ID,那么试试这个:

SELECT article_id
FROM article_category
GROUP BY article_id
HAVING GROUP_CONCAT(DISTINCT category_id ORDER BY category_id SEPARATOR ',') = '1,2'

http://sqlfiddle.com/#!2/9d213/4 查看它的运行情况

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

关于MySQL选择多对多位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23231549/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com