代码之家  ›  专栏  ›  技术社区  ›  Richard H

Mysql:选择并分组

  •  0
  • Richard H  · 技术社区  · 15 年前

    很抱歉这个糟糕的标题-如果有人想把它改成更不言自明的东西,太好了-我不知道该如何表达这个问题。即:

    我有一张这样的桌子:

    POST_ID (INT)   TAG_NAME (VARCHAR)
    
        1              'tag1'
        1              'tag2'
        1              'tag3'
        2              'tag2'
        2              'tag4'
       ....
    

    我要做的是计算同时有tag1和tag2的帖子的数量。
    我已经把GROUP BY、DISTINCT和COUNT搞乱了,但是我不能构造一个查询来完成这个任务。
    有什么建议吗?

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

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

    谢谢

    3 回复  |  直到 15 年前
        1
  •  2
  •   Konerak    15 年前

    编辑:因为“TABLE”对于缺少的tablename是一个糟糕的选择,所以我假设您的表被调用 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'
    
        2
  •  0
  •   Matchu    15 年前

    我只是把这个(未测试的)依赖子查询解决方案留在这里作为参考,尽管一旦您进入大型数据集,它可能会非常慢。任何使用连接执行相同操作的解决方案都应该选择此解决方案。

    假设你有一个 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)
    
        3
  •  0
  •   Bruno Gautier    15 年前

    请尝试以下查询:

    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'