我有一张posts
表和一张post_tags
表
这是我的帖子表结构示例:
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
表中选择tag_id
个1和2的所有帖子,我尝试了不同的联接但没有成功。
post_tags表数据的示例:
post_id tag_id
1 1
2 1
5 2
6 1
6 2
HERE例如我的查询应该返回post(来自post表)id为6,在示例中注意6的post_id有tag_id 1 AND tag_id 2不仅仅是其中一个而是同时出现。
答案 0 :(得分:2)
您可以通过聚合执行此操作:
select post_id
from post_tags pt
group by post_id
having sum(tag_id = 1) > 0 and
sum(tag_id = 2) > 0;
如果您想查看来自posts
的实际信息,请将该表加入。
您有一个“set-within-sets”查询。这是一个常见的查询,我更喜欢使用聚合和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;
等等。
答案 1 :(得分:0)
尝试一下:
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
答案 2 :(得分:0)
这应该有效
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;
答案 3 :(得分:0)
select a.post_id, b.post_id, a.post_user, b.post_tags
from posts as a
inner join post_tags as b
where b.post_tags in(1, 2)
或
select a.post_id, b.post_id, a.post_user, b.post_tags
from posts as a
inner join post_tags as b
where b.post_tags =1 or b.post_tags = 2