1

我对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

我想找到生产 cd 数量最多的 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

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

    etaireia  cds
    ________________    
    COLUMBIA   8

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

4

3 回答 3

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
   )

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

限制为单行的方法因 RDBMS 而异。MySQL 使用LIMIT,MSSQL 使用TOP,Oracle 使用ROWNUM……使用 RDBMS 特定的方法使这变得简单多了,因为您不需要在HAVING子句中嵌套子查询。相反,您可以LIMITHAVING子查询中使用只返回一个最大的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
)

这是特定于 MySQL 的版本...

于 2012-11-24T19:30:15.203 回答
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 语法的 Postgres 和 SQL-Server 中工作FETCH ... OFFSET(相当于供应商特定的LIMITand TOP):

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语法不解析关系,只返回来自被绑定的行的一行。

于 2013-01-18T15:44:34.900 回答
0

那么只选择第一个:

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

忽略,因为您不想使用限制。

于 2012-11-24T19:32:36.777 回答