我是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方法,因为它不是通用的。 提前致谢
答案 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
)
答案 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中工作(相当于特定于供应商的LIMIT
和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
语法不能解析关系,只返回绑定的一行。
答案 2 :(得分:0)
那么只选择第一个:
select Top 1 etaireia ,count(all code_cd) as cds
from cd_production
group by etaireia
无视,因为你不想使用限制。