对具有特定标记

时间:2015-05-15 21:34:37

标签: php mysql sql

我有帖子,标签,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)

这肯定不起作用,因为我只收到一个标签,而不是所有标签。

2 个答案:

答案 0 :(得分:1)

您可以使用group byhaving

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的形式完成,但我建议的方式可能更快,因为服务器不必处理与实际组操作无关的数据。