【问题标题】:How to find the maximum count using mysql?如何使用mysql找到最大计数?
【发布时间】:2013-05-02 16:54:31
【问题描述】:

请告诉我以下命令有什么问题

mysql> select max(count(*)) from emp1 group by name;
ERROR 1111 (HY000): Invalid use of group function

【问题讨论】:

  • 我想表格中有几行 name 具有相同的值。他想找到行数最多的name
  • 您是否要计算name,然后只返回最高计数?
  • 不能在同一范围内聚合聚合

标签: mysql


【解决方案1】:

如果数据碰巧多次出现最大值,LIMIT 1 将不会回答问题。 为了说明这一点,我使用了来自 MySQLWOLRD 数据库示例来回答这个问题。

Q) 返回语言数量最多的国家/地区列表。

五个国家适合拥有相同数量的语言即 12

  1. 加拿大
  2. 中国
  3. 印度
  4. 俄罗斯
  5. 美国

首先,我们需要创建一个VIEW来保存最大值(本例中为12)

CREATE VIEW abc AS SELECT count(countrycode) AS total FROM 
countrylanguage GROUP BY countrycode 
ORDER BY COUNT(countrycode) DESC limit 1;

然后在下面的 SELECT 语句中使用 view

SELECT `name`, COUNT(country.`name`) FROM country JOIN    
countrylanguage ON country.`code` = countrylanguage.countrycode 
GROUP BY country.`name` 
HAVING COUNT(country.`name`) = (SELECT total FROM abc) ;

【讨论】:

    【解决方案2】:

    根据提供的代码,我了解到您希望选择最多的同名员工。

    您的查询的问题是您试图在单个范围内应用多个级别的聚合。

    试试这个:

    SELECT MAX(Total) FROM (SELECT COUNT(*) AS Total FROM emp1 GROUP BY name) AS Results
    

    ...或者这个:

    SELECT COUNT(name) FROM emp1 GROUP BY name ORDER BY COUNT(name) DESC LIMIT 1
    

    两个查询都返回相同的结果,但它们的实现不同。

    使用最适合您或您喜欢的任何一个。

    【讨论】:

    • 除非我们特别迂腐,否则我认为这提供了一个答案——尽管按限制排序会更常见
    • 子查询更规范,因为按限制排序更像是一种黑客攻击,所以你可以在野外看到两者。第一个最常由受过数据持久性正规教育的程序员编写,但我们确实可以看到。
    【解决方案3】:
     ***Example: 1***
     SELECT *
     FROM customer
     WHERE customer.ID IN
          (SELECT customer_id
             FROM (SELECT customer_id, MAX(cust_count)
                     FROM (SELECT customer_id,
                                  COUNT(customer_id)
                                     AS cust_count
                             FROM `order`
                           GROUP BY customer_id) AS cust_count_tbl) AS cust_tbl);
    
    
    ***Example -2*** 
    
    SELECT *
          FROM    customer
       LEFT JOIN
          (SELECT customer_id, COUNT(customer_id) AS cc
             FROM `order`
           GROUP BY customer_id
           ORDER BY cc DESC
            LIMIT 1) AS kk
       ON customer.ID = kk.customer_id
       WHERE kk.customer_id = customer.ID;
    

    【讨论】:

      【解决方案4】:

      你在问“你的陈述有什么问题”。这是你的声明:

      select max(count(*))
      from emp1
      group by name;
      

      明白你的意思。但是 SQL 编译器没有。原因很简单。给定的select 只能有一个group by 子句。您的查询要求其中两个。第一个是group by 名称。第二个是所有这些结果的聚合。

      编写查询的正确方法(如您所愿)是使用子查询:

      select max(cnt)
      from (select count(*) as cnt
            from emp1
            group by name
           ) t
      

      这是一个完全合理的解决方案,只使用标准 SQL。其他答案已经提出了使用limit 子句的解决方案,这可能会更有效率。

      【讨论】:

        【解决方案5】:
        SELECT  MAX(name_count)
        FROM
                (
                SELECT  name
                        ,count(*) as name_count
                FROM    emp1 
                GROUP BY
                        name
                )
        

        【讨论】:

        • 有没有办法在最外层的 SELECT 语句中也选择名称?因此,如果您想知道哪个名称组是具有 MAX(name_count) 的名称组?
        【解决方案6】:

        您必须选择name 对其进行分组,然后在其结果上使用max() 作为子查询:

        select max(count)
        from (
          select
            name,
            count(*) as count
          from emp1
          group by name) x
        

        我已经对查询进行了格式化,这样您就可以看到正在发生的事情,而不是像您展示的那样把它全部放在一行上。顺便说一句,fnf 处的“x”是子查询的必需别名。

        【讨论】:

          【解决方案7】:

          我会做以下事情(假设我理解正确你想要什么):

          select c from
          (
              select count(*) as c, name from emp1 group by name
          ) tmp
          order by c desc limit 1
          

          这会按名称从所有计数中选择最大的计数。例如,如果您的表包含

          Name
          -----------------------
          Test
          Test
          Hello
          World
          World
          World
          

          内部选择会用这些数据创建一个“表”

          c         Name
          ----------------------
          2         Test
          1         Hello
          3         World
          

          外部选择将按c 降序排列并选择第一个条目,即3

          这可以缩短为

          select count(*) c from emp1 group by name order by c desc limit 1
          

          【讨论】:

          • 显然,这里不需要外部查询。 ORDER BY COUNT(*) DESC LIMIT 1 也可以
          【解决方案8】:

          试试:

          SELECT NAME, COUNT(*) as c FROM table GROUP BY name ORDER BY c DESC LIMIT 1

          【讨论】:

          • matsko 批准了 Halley 的编辑,将 NAME, 添加到选择中。但是,如果目标是简单地取回最大计数的标量值,则不需要此更改。那样的话,可以直接使用原代码:SELECT COUNT(*) as c FROM table GROUP BY name ORDER BY c DESC LIMIT 1
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-28
          • 2013-03-28
          相关资源
          最近更新 更多