【问题标题】:mysql count group by havingmysql通过拥有计数组
【发布时间】:2011-12-13 00:57:32
【问题描述】:

我有这张桌子:

Movies (ID, Genre)

一部电影可以有多种流派,因此 ID 不是特定于流派的,它是多对多的关系。我想要一个查询来查找恰好有 4 种类型的电影总数。我当前的查询是

  SELECT COUNT(*) 
    FROM Movies 
GROUP BY ID 
  HAVING COUNT(Genre) = 4

但是,这会返回一个 4 的列表而不是总和。如何获取总和而不是 count(*) 的列表?

【问题讨论】:

    标签: mysql sql group-by aggregate-functions


    【解决方案1】:

    一种方法是使用嵌套查询:

    SELECT count(*)
    FROM (
       SELECT COUNT(Genre) AS count
       FROM movies
       GROUP BY ID
       HAVING (count = 4)
    ) AS x
    

    内部查询获取恰好有 4 种类型的所有电影,然后外部查询计算内部查询返回的行数。

    【讨论】:

      【解决方案2】:
      SELECT COUNT(*) 
      FROM   (SELECT COUNT(*) 
              FROM   movies 
              GROUP  BY id 
              HAVING COUNT(genre) = 4) t
      

      【讨论】:

        【解决方案3】:

        也许

        SELECT count(*) FROM (
            SELECT COUNT(*) FROM Movies GROUP BY ID HAVING count(Genre) = 4
        ) AS the_count_total
        

        虽然这不是所有电影的总和,但有多少电影有 4 种类型。

        所以也许你想要

        SELECT sum(
            SELECT COUNT(*) FROM Movies GROUP BY ID having Count(Genre) = 4
        ) as the_sum_total
        

        【讨论】:

        • 我再次更新了它(v1),为语句设置别名,否则得到Every derived table must have its own alias
        【解决方案4】:

        怎么样:

        SELECT COUNT(*) FROM (SELECT ID FROM Movies GROUP BY ID HAVING COUNT(Genre)=4) a
        

        【讨论】:

        • 最后一个'a'应该做什么?
        • @EricVB 这是结果的列别名。 MySQL 允许(还)省略关键字AS
        猜你喜欢
        • 2013-12-12
        • 1970-01-01
        • 1970-01-01
        • 2016-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多