您可以使用 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's approach 相同,只是得出的最高计数不同。)
或者,您可以使用变量对所有计数进行排名,然后仅返回排名为 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
;