我有一个posts表和一个post_tags表--这里是我的post结构示例:
post_id int(11)
post_user int(11)
post_title text
post_content longtext这是我的post_tags结构示例:
post_id int(11)
tag_id int(11)我需要的是从posts表中选择同时具有1和2的tag_id的所有帖子,我尝试了不同的连接,但没有成功。
post_tags表数据示例:
post_id tag_id
1 1
2 1
5 2
6 1
6 2例如,在这里,我的查询应该返回id为6的post (从post表),在示例中观察post_id of 6有tag_id 1和tag_id 2--不仅其中之一,而且两者同时存在。
发布于 2013-08-30 19:18:55
您可以通过聚合来完成这一任务:
select post_id
from post_tags pt
group by post_id
having sum(tag_id = 1) > 0 and
sum(tag_id = 2) > 0;如果您想查看来自posts的实际信息,只需加入该表即可。
编辑(一点解释):
您有一个“集内集”查询。这是一个常见的查询,我更喜欢使用聚合和having子句来解决它,因为这是最通用的方法。
having子句中的每个条件都在计算与其中一个标记匹配的行数。也就是说,sum(tag_id = 1)正在计算post_tags中的行,这是正确的。条件> 0只是说"tag_id =1至少存在于一行上“。
我之所以喜欢这种方法,是因为你可以很容易地概括它。如果您也需要标记3和4:
having sum(tag_id = 1) > 0 and
sum(tag_id = 2) > 0 and
sum(tag_id = 3) > 0 and
sum(tag_id = 4) > 0;诸若此类。
发布于 2013-08-30 19:29:10
试试看:
SELECT post.*
FROM (SELECT T1.post_id
FROM (SELECT * FROM post_tags WHERE 1 IN(tag_id)) T1
INNER JOIN (SELECT * FROM post_tags WHERE 2 IN(tag_id)) T2 ON T1.post_id = T2.post_id)
T3
INNER JOIN post ON T3.post_id=post.post_id;SQL链接:http://sqlfiddle.com/#!2/04f74/33
发布于 2013-08-30 19:30:28
这应该能行
select q.* from (
select p.post_id as post_id from post_tags p
where p.tag_id=1
and exists (
select 1 from post_tags p2
where p2.post_id=p.post_id
and p2.tag_id=2)
) as t
inner join posts q on posts_id=t.post_id;https://stackoverflow.com/questions/18540037
复制相似问题