MySQL:实现重复数值的增量交替排序
纯SQL实现交替排序方案
当然可以只用SQL完成这个交替排序需求,下面分两种MySQL版本给出具体实现:
1. MySQL 8.0及以上版本(支持窗口函数)
利用ROW_NUMBER()窗口函数给每个相同values的行分配组内序号,再通过序号+values排序实现交替效果:
SELECT id, `values` FROM ( SELECT id, `values`, -- 按values分组,每组内按id排序并分配序号 ROW_NUMBER() OVER (PARTITION BY `values` ORDER BY id) AS row_num FROM test_table -- 替换成你的表名 ) AS temp -- 先按组内序号排序,再按values排序,实现交替 ORDER BY row_num, `values`;
原理说明
PARTITION BY \values`将相同values`的行划分为一组ROW_NUMBER()给每组内的行按id(可替换为你需要的排序字段)分配连续序号- 外层按
row_num升序、values升序排序,就能让不同values的同序号行交替出现
2. MySQL 5.x版本(不支持窗口函数)
用用户自定义变量模拟组内序号分配,同样实现交替排序:
SELECT id, `values` FROM ( SELECT id, `values`, -- 若当前行values和上一行相同,序号+1,否则重置为1 @row_num := IF(@current_val = `values`, @row_num + 1, 1) AS row_num, @current_val := `values` FROM test_table, -- 替换成你的表名 -- 初始化变量 (SELECT @row_num := 0, @current_val := NULL) AS vars -- 先按values分组,再按id排序,保证变量计算顺序正确 ORDER BY `values`, id ) AS temp ORDER BY row_num, `values`;
效果验证
假设原表数据如下:
| id | values |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 2 |
| 6 | 2 |
执行上述SQL后,输出结果会是:
| id | values |
|---|---|
| 1 | 1 |
| 4 | 2 |
| 2 | 1 |
| 5 | 2 |
| 3 | 1 |
| 6 | 2 |
完全符合1、2、1、2的交替排序需求。
内容的提问来源于stack exchange,提问作者meks285
相关产品推荐
相关产品推荐

