mysql选择具有独占AND的行

时间:2013-08-30 19:16:43

标签: mysql sql

我有一张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的pos​​t_id有tag_id 1 AND tag_id 2不仅仅是其中一个而是同时出现。

4 个答案:

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