我有一个这样的表:
Rank Letter 1 A 2 A 3 B 4 A 5 C 6 A 7 C 8 C 9 B 10 C
我需要按升序排列的每个字母的前 2 个:
Rank Letter 1 A 2 A 3 B 5 C 7 C 9 B
我该怎么做?使用 GROUP BY 仅获得前 1 名是相当简单的,但我似乎无法让它为多个条目工作
最佳答案
SELECT mo.Letter, md.Rank
FROM (
SELECT DISTINCT letter
FROM mytable
) mo
JOIN mytable md
ON md.Letter >= mo.Letter
AND md.Letter <= mo.Letter
AND Rank <=
COALESCE
(
(
SELECT Rank
FROM mytable mi
WHERE mi.letter = mo.letter
ORDER BY
Rank
LIMIT 1, 1
),
0xFFFFFFFF
)
您需要在 (Letter, Rank)
上有一个复合索引(按此顺序)
注意这个结构:
md.Letter >= mo.Letter
AND md.Letter <= mo.Letter
不仅仅是 md.Letter = mo.Letter
它强制为每条记录检查范围
,这样效率更高。
请参阅我博客中的这篇文章:
有关这方面的更多详细信息。
关于MySQL Group By每种类型的前N个数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1537606/