【问题标题】:Query with count and maximum function使用计数和最大值功能查询
【发布时间】:2021-07-21 02:09:57
【问题描述】:

我有这个表作为以下查询的结果:

select id, count(*) C
from t1
group by id

ID.   C 
01.   11
02.   21
03.   18
04.   09
05.   21
...

如何获取与最大计数关联的所有 ID? (在我的情况下是 02 和 05)

我试过了:

select id, count(*) C
from t1
group by id
where c= max(c)

但它不起作用

【问题讨论】:

  • 你的MySql是什么版本的?

标签: mysql sql database mysql-workbench


【解决方案1】:

在 MySQL 5.x 中,我会参考一个子查询来获取您想要过滤的 max_c 值...

select id, count(*) c
from t1
group by id
having c = (SELECT MAX(c) FROM (SELECT COUNT(*) c FROM t1 GROUP BY id) t1_agg)

或者……

select id, count(*) c
from t1
group by id
having c = (
  SELECT COUNT(*)
    FROM t1
GROUP BY id
ORDER BY COUNT(*) DESC
   LIMIT 1
)

在 MySQL 8 中,我会使用窗口函数...

WITH
  t1_agg AS
(
  SELECT
    id,
    COUNT(*)   AS c,
    MAX(COUNT(*)) OVER ()   AS max_c
  FROM
    t1
  GROUP BY
    id
)
SELECT
  *
FROM
  t1_agg
WHERE
  c = max_c

【讨论】:

    【解决方案2】:

    您可以使用子查询,只需选择与max(id) 匹配的id,例如...

    SELECT FirstName, Count(id) AS count
    FROM Person
    GROUP BY FirstName
    HAVING count = (
        SELECT MAX(count1)
        FROM (
            SELECT FirstName, Count(id) AS count1
            FROM Person
            GROUP BY FirstName
        )
    p2) 
    

    子查询是一个强大的工具,因为它是...

    ...另一个语句中的 SELECT 语句。 (来源:Dev.MySQL.com。)

    【讨论】:

    • 我还要注意,它需要是一个双重嵌套的子查询...(SELECT MAX(c) FROM (SELECT COUNT(*) c FROM t1 GROUP BY id) t1_agg) 这对于 OP 来说可能不会立即显而易见。
    • 啊,你说得对,我以为我漏掉了什么,谢谢你的注意。
    【解决方案3】:

    如果您可以将 id 作为逗号分隔列表处理,则可以使用:

    select cnt, group_concat(id)
    from (select id, count(*) as cnt
          from t1
          group by id
         ) i
    order by cnt
    limit 1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 2019-03-13
      • 1970-01-01
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多