如何从count中选择具有最大生成值的行

时间:2012-11-24 19:26:01

标签: mysql sql mysql-workbench

我是mysql的新手,所以我被困在一个查询上。 我有一个叫做歌曲的数据库中的表(我只能在这个数据库中读取):

table name:cd_production

code_cd  etaireia  etos
______________________
400400  ODEON     1987
400401  ODEON     1986
400412  COLUMBIA  1990
400420  COLUMBIA  1990
400657  LYRA      1965
410000  COLUMBIA  1962
410001  COLUMBIA  1964
410003  PHILIPS   1979
410005  PHILIPS   1971
420430  ODEON     2002
420440  LYRA      2005
420450  COLUMBIA  2009
420460  ODEON     2007
420470  PHILIPS   2008
420480  ODEON     2002
420490  COLUMBIA  2010
500500  SONY      1968
500510  SONY      1972
600601  COLUMBIA  1962
600602  COLUMBIA  1963
600603  ODEON     1964
670670  PHILIPS   1983

我希望找到产生最大cds数量的etaireia(意味着每个etaireia的code_cd不同)。 我问

select etaireia ,count(all code_cd) as cds
from cd_production
group by etaireia

我得到一个带有返回列的列表

etaireia  cds
________________    
COLUMBIA   8
LYRA       2
ODEON      6
PHILIPS    4
SONY       2

这有点正确,但我不知道如何只获得最大cds的etaireia

    etaireia  cds
    ________________    
    COLUMBIA   8

这里的诀窍是什么? 我不想使用LIMIT 1方法,因为它不是通用的。 提前致谢

3 个答案:

答案 0 :(得分:2)

如果您希望查找计数最多的所有记录及其计数,可以使用HAVING子句中的子查询来确定MAX() COUNT()的值SELECT etaireia, COUNT(*) AS cds FROM cd_production GROUP BY etaireia HAVING cds = ( SELECT MAX(cds) FROM (SELECT etaireia, COUNT(*) as cds FROM cd_production GROUP BY etaireia) subq )

LIMIT

http://sqlfiddle.com/#!2/869b4/4

限制为单行的方法在RDBMS之间变化。 MySQL使用TOP,MSSQL使用ROWNUM,Oracle使用HAVING ...使用特定于RDBMS的方法使这更简单,因为您不需要在{{中嵌套子查询1}}子句。相反,您可以使用LIMIT子查询中的HAVING仅返回最大的COUNT(),而无需将另一个查询换行以获取MAX()

SELECT 
  etaireia,
  COUNT(*) AS cds
FROM
  cd_production
GROUP BY etaireia
HAVING cds = (
   SELECT COUNT(*)
   FROM cd_production 
   GROUP BY etaireia
   ORDER BY COUNT(*) DESC 
   LIMIT 1
)

and here is the MySQL-specific version ...

答案 1 :(得分:1)

其他“通用”方法,应该在大多数DBMS中运行(并且不使用MYSQL特定的LIMIT关键字):

SELECT 
    etaireia,
    COUNT(*) AS cds
FROM
    cd_production c
GROUP BY 
    etaireia
HAVING 
    COUNT(*) >= ALL 
        ( SELECT COUNT(*) 
          FROM cd_production cc
          GROUP BY cc.etaireia
        ) ; 

和此:

SELECT 
    etaireia,
    COUNT(*) AS cds
FROM
    cd_production  c
GROUP BY 
    etaireia
HAVING 
    NOT EXISTS
        ( SELECT * 
          FROM cd_production  cc
          GROUP BY cc.etaireia
          HAVING COUNT(*) > COUNT(DISTINCT c.code_cd)
        ) ; 

在SQL-Fiddle中进行了测试: test-1 (适用于所有4:Postgres,SQL-Server,Oracle,MySQL,但第二个查询除了Postgres中没有运行)。


对于那些具有窗口函数(以及OVER子句)的DBMS,还有另一种方法(适用于Postgres,Oracle,SQL-Server 2012):

SELECT etaireia, cds
FROM
  ( SELECT 
        etaireia, cds,
        RANK() OVER (ORDER BY cds DESC) AS rnk
    FROM
      ( SELECT 
            etaireia,
            COUNT(*) AS cds 
        FROM
            cd_production  c
        GROUP BY 
            etaireia
      ) tmp
  ) tmp2
WHERE rnk = 1 ;

以下是“标准”方式。它应该在支持标准SQL语法FETCH ... OFFSET的Postgres和SQL-Server中工作(相当于特定于供应商的LIMITTOP):

SELECT 
    etaireia,
    COUNT(*) AS cds
FROM
    cd_production AS c
GROUP BY 
    etaireia
ORDER BY
    cds DESC
OFFSET 0 ROWS
FETCH FIRST 1 ROWS ONLY ;

在SQL-Fiddle中进行了测试: test-3 (Q4适用于Postgres和SQL-Server 2012)。 请注意,这个结果将提供与3个第一个查询不同的结果,因为FETCH语法不能解析关系,只返回绑定的一行。

答案 2 :(得分:0)

那么只选择第一个:

select Top 1 etaireia ,count(all code_cd) as cds
from cd_production
group by etaireia

无视,因为你不想使用限制。