Mysql:SELECT和GROUP BY

时间:2010-11-25 12:55:48

标签: mysql group-by

对于糟糕的标题感到抱歉 - 如果有人想要更改一些不言自明的东西,很棒 - 我不知道如何表达问题。这是:

我有一张这样的表:

POST_ID (INT)   TAG_NAME (VARCHAR)

    1              'tag1'
    1              'tag2'
    1              'tag3'
    2              'tag2'
    2              'tag4'
   ....

我想要做的是计算同时包含tag1和tag2的POST数量 我已经搞乱了GROUP BY和DISTINCT以及COUNT但是我无法构造一个可以解决问题的查询。
有什么建议吗?

编辑:在伪sql中,我想要的查询是:

SELECT DISTINCT(POST_ID) WHICH HAS TAG_NAME = 'tag1' AND TAG_NAME = 'tag2'; 

由于

3 个答案:

答案 0 :(得分:2)

编辑:因为'TABLE'对于缺少的表名来说是一个糟糕的选择,我假设你的表被称为Posts

加入桌子对抗自己:

SELECT * FROM Posts P1
JOIN Posts P2
ON P1.POST_ID = P2.POST_ID
WHERE P1.TAG_NAME = 'tag1'
AND P2.TAG_NAME = 'tag2'

答案 1 :(得分:0)

尝试以下查询:

SELECT COUNT(*) nb_posts
FROM (
    SELECT post_id, COUNT(*) nb_tags
    FROM table
    WHERE tag_name in ('tag1','tag2')
    GROUP BY post_id
    HAVING COUNT(*) = 2
  ) t

修改:根据Konerak的回答,以下是当给定帖子有重复的标记名称时处理案例的查询:

SELECT DISTINCT t1.post_id
FROM table t1
  JOIN table t2
    ON t1.post_id = t2.post_id
       AND t2.tag_name = 'tag2'
WHERE t1.tag_name = 'tag1'

答案 2 :(得分:0)

我只是将这个(未经测试的)从属子查询解决方案留在这里作为参考,即使它在进入大型数据集时可能会非常慢。应该选择任何使用连接执行相同操作的解决方案。

假设您的posts表格中包含id字段:

SELECT count(*) FROM posts WHERE EXISTS(SELECT NULL FROM posts_tags WHERE tag = 'tag1' AND post_id = posts.id) AND EXISTS(SELECT NULL FROM posts_tags WHERE tag = 'tag2' AND post_id = posts.id)