假设我有两个SQL表。一个表示包含列(post_id,post_content)的帖子,另一个表示与包含列的帖子关联的标签(post_id,tag_text)。
如果我想检索包含TAG1
和TAG2
的帖子,我需要做什么,因为像
SELECT post_id FROM posts JOIN tags ON posts.post_id=tags.post_id
WHERE tag_text ='TAG1' AND tag_text='TAG2'
显然不能做我想要的事情?
编辑:请注意,在我的示例中动态生成AND的数量。也就是说,将内连接加倍是不够的。
答案 0 :(得分:0)
以下是查询:
SELECT * FROM posts p
WHERE
EXISTS ( SELECT 1 FROM tags t1 WHERE t1.post_id = p.post_id AND t1.tag_text='TAG1')
AND
EXISTS ( SELECT 1 FROM tags t2 WHERE t2.post_id = p.post_id AND t2.tag_text='TAG2')
如果标签文本的数量不固定,您可以生成动态查询(每个标签的动态EXISTS)。
答案 1 :(得分:0)
select p.post_id
from posts p
join tags t ON p.post_id=t.post_id
where t.tag_text in ( 'TAG1', 'TAG2')
group by p.post_id
having count(distinct t.tag_text) = 2;
但是,这也会返回超过这两个标签的帖子(例如tag1,tag2和tag3)。如果您不想这样,则需要将结果限制为具有两个标记的帖子:
select p.post_id
from posts p
join tags t ON p.post_id=t.post_id
where t.tag_text in ( 'TAG1', 'TAG2')
group by p.post_id
having count(distinct t.tag_text) = 2
and count(distinct t.tag_text) = (select count(*)
from tags t2
where t2.post_id = t.post_id);
顺便说一句:如果你只想要post_id
你根本不需要加入:
select post_id
from tags
where tag_text in ( 'TAG1', 'TAG2')
group by post_id
having count(distinct tag_text) = 2;