**castID**
nm0000116
nm0000116
nm0000116
nm0000116
nm0000116
nm0634240
nm0634240
nm0798899
这是我的表(创建为视图)。现在我想列出计数最多的 castID(在本例中为 nm0000116,以及它在此表中的出现次数/计数(应该是 5 次),我不太确定要使用哪个查询
SELECT
MAX(E),
castId
FROM
(SELECT COUNT(castId) AS E,castId FROM [directors winning movies list] GROUP BY castId) AS t
尝试
Select CastId, count(*) countOfCastId
From table
Group By CastId
Having count(*)
= (Select Max(cnt)
From (Select count(*) cnt
From table
Group By CastId) z)
您可以使用返回最高计数LIMIT
:
SELECT castID,
COUNT(*) AS Cnt
FROM atable
GROUP BY castID
ORDER BY Cnt DESC
LIMIT 1
;
但是,如果存在平局,则上述查询将仅返回一行。如果您想要所有“赢家”,您可以将上述查询中的计数作为标量结果,并将其与所有计数进行比较以仅返回匹配的计数:
SELECT castID,
COUNT(*) AS Cnt
FROM atable
GROUP BY castID
HAVING COUNT(*) = (
SELECT COUNT(*)
FROM atable
GROUP BY castID
ORDER BY Cnt DESC
LIMIT 1
)
;
(基本上,与Charles Bretana 的方法相同,它只是以不同的方式得出最高计数。)
或者,您可以使用变量对所有计数进行排名,然后仅返回排名为 1 的计数:
SELECT castID,
Cnt
FROM (
SELECT castID,
COUNT(*) AS Cnt,
@r := IFNULL(@r, 0) + 1 AS r
FROM atable
GROUP BY castID
ORDER BY Cnt DESC
) AS s
WHERE r = 1
;
请注意,使用上述方法,变量必须不存在或在运行查询之前使用 0 或 NULL 预初始化。为了安全起见,您可以直接在查询中初始化变量:
SELECT s.castID,
s.Cnt
FROM (SELECT @r := 0) AS x
CROSS JOIN
(
SELECT castID,
COUNT(*) AS Cnt,
@r := @r + 1 AS r
FROM atable
GROUP BY castID
ORDER BY Cnt DESC
) AS s
WHERE s.r = 1
;