SQL选择和内部连接与AND

时间:2013-11-30 16:52:24

标签: sql sqlite

假设我有两个SQL表。一个表示包含列(post_id,post_content)的帖子,另一个表示与包含列的帖子关联的标签(post_id,tag_text)。

如果我想检索包含TAG1TAG2的帖子,我需要做什么,因为像

这样的请求
SELECT post_id FROM posts JOIN tags ON posts.post_id=tags.post_id 
WHERE tag_text ='TAG1' AND tag_text='TAG2'

显然不能做我想要的事情?

编辑:请注意,在我的示例中动态生成AND的数量。也就是说,将内连接加倍是不够的。

2 个答案:

答案 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;