MySQL Group By每种类型的前N个数

标签 mysql group-by ranking

我有一个这样的表:

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/

相关文章:

mysql - Nodejs + mysql2/promise 连接太多

mysql - 如何对 NULL 字段进行分组

mysql - 使用 union 按查询优化组

node.js - 如何在 Sequelize.js 中查询 Group by 和 MAX(id)

php - SQL 代码执行 : Trending topics equals a twitter

mysql - 模拟mysql中的排名(无排名)有两个条件

php - 删除多个字段失败

PHP MySQL根据变量更改选择查询

php - 子查询不适用于 php

java - 如何找到一个整数在斐波那契数列中的位置