在 MySQL 中实现组内排序,可以使用 ORDER BY 结合 GROUP BY,或者通过窗口函数(MySQL 8.0+ 支持)来实现更复杂的组内排序需求。
对分组后的结果进行组内排序,基本语法如下:
SELECT 分组字段, 聚合字段
FROM 表名
GROUP BY 分组字段
ORDER BY 排序字段 [ASC|DESC];
示例:假设有 sales 表(包含 region 地区、product 产品、amount 销售额),按地区分组后,每组内按销售额降序排序:
SELECT region, product, SUM(amount) AS total_sales
FROM sales
GROUP BY region, product
ORDER BY region, total_sales DESC;
MySQL 8.0 及以上版本支持窗口函数,可实现更灵活的组内排序(如组内排名):
SELECT
字段,
窗口函数() OVER (PARTITION BY 分组字段 ORDER BY 排序字段) AS 排名别名
FROM 表名;
-
ROW_NUMBER():组内连续编号(即使值相同也不重复)
-
RANK():组内排名(值相同会跳号,如 1,2,2,4...)
-
DENSE_RANK():组内排名(值相同不跳号,如 1,2,2,3...)
示例:为每个地区的产品按销售额排名:
SELECT
region,
product,
amount,
ROW_NUMBER() OVER (PARTITION BY region ORDER BY amount DESC) AS row_num,
RANK() OVER (PARTITION BY region ORDER BY amount DESC) AS rnk,
DENSE_RANK() OVER (PARTITION BY region ORDER BY amount DESC) AS dense_rnk
FROM sales;
对于不支持窗口函数的旧版本,可以用变量实现组内排序:
SET @row_num = 0;
SET @prev_region = '';
SELECT
region,
product,
amount,
@row_num := IF(@prev_region = region, @row_num + 1, 1) AS row_num,
@prev_region := region
FROM sales
ORDER BY region, amount DESC;
以上方法可根据 MySQL 版本和具体需求选择,窗口函数是最简洁高效的方案(推荐 MySQL 8.0+ 使用)。