我有帖子,标签,post_tags表。
现在我希望获得所有包含(a,b,d)标签的帖子
我如何实现这一点,而不仅仅是使用一个/两个/所有标签获取所有帖子?
tables:
posts:
id, title
tags:
id, title
post_tags:
post_id, tag_id
我的简单想法是这个查询:
select *
from post_tags pt
join posts ps on pt.post_id=ps.id
where pt.tag_id in (MY_DESIRED_TAGS)
这肯定不起作用,因为我只收到一个标签,而不是所有标签。
答案 0 :(得分:1)
您可以使用group by
和having
:
select p.*
from posts p join
post_tags pt
on pt.post_id = p.id
where pt.tag_id in (MY_DESIRED_TAGS)
group by p.post_id
having count(*) = <# desired tags>;
关键是计算匹配的标签数量。如果您有三个标签,那么having
子句将是:
having count(*) = 3
答案 1 :(得分:0)
SELECT *
FROM posts ps
WHERE ps.id IN (
SELECT pt.post_id
FROM post_tags pt
WHERE pt.tag_id IN ([MY_DESIRED_TAGS])
GROUP BY pt.post_id
HAVING COUNT(1) = [THE_NUMBER_OF_DESIRED_TAGS]
)
;
子查询查找每个帖子的标签数量(提供的标签数量),并将post id值作为结果集。外部查询然后查找具有这些id值的帖子。它可以像其他答案所指示的那样以JOIN的形式完成,但我建议的方式可能更快,因为服务器不必处理与实际组操作无关的数据。