gpt4 book ai didi

mysql - 排除具有多对多关系的行

转载 作者:可可西里 更新时间:2023-11-01 07:54:19 24 4
gpt4 key购买 nike

我有三个表:posts、tags 和 posts_has_tags(它们促进了 posts 和 tags 之间的多对多关系)。一篇文章可以有任意数量的标签。

“帖子”表包含以下列:身份证件文本

“标签”表有这些:身份标签姓名

至于“posts_has_tags”表:posts_idpoststags_idtags

我不能做的是想出一个查询来选择所有帖子,除了那些在分配给它们的“名称”列中有一个或多个标签具有特定值的帖子。它似乎应该包含一个“NOT EXISTS”,但我真的不能完全理解它。

提前感谢您的帮助。

编辑:

另外,是否可以同时限制结果集为某些标签?例如:

排除标签:a, b包含标签:c

带有标签“a”、“f”的帖子不会进入结果集(因为如果包含标签则不会)。带有标签“a”、“b”、“c”的帖子也不会进入结果集(因为它的“a”和“b”被排除在外)。带有标签“c”、“f”的帖子确实会进入结果集,因为“c”是包含的标签。

最终编辑我终于找到了一个似乎有效且性能相当不错的解决方案:http://www.mysqldiary.com/a-many-to-many-relationship-table-solving-the-exclude-relation-problem/

最佳答案

您可以使用反加入。

SELECT p.* 
FROM posts p
LEFT JOIN post_has_tags pt ON (pt.post_id = p.id)
LEFT JOIN tags t ON (t.id = pt.tag_id AND t.name IN ('test','test1','test2'))
WHERE t.id IS NULL
GROUP BY p.id

如果你想强制包含其他标签,你再做一次连接。

SELECT p.* 
FROM posts p
LEFT JOIN post_has_tags pt ON (pt.post_id = p.id)
LEFT JOIN tags t ON (t.id = pt.tag_id AND t.name IN ('a','b'))
INNER JOIN tags t2 ON (t2.id <> t.id AND t2.id = pt.tag_id AND t2.name IN ('c'))
WHERE t.id IS NULL
GROUP BY p.id

这将使排除优先于包含。
如果您想优先考虑包含,请将内部连接替换为:

INNER JOIN tags t2 ON (t2.id = pt.tag_id AND t2.name IN ('c')) 

关于mysql - 排除具有多对多关系的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7713806/

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