假如有个场景:
需要先对表数据做分组,然后再排序,默认情况下,MySQL Group by后,会直接取分组后的第一条数据,然后在对分组结果做排序。
比如原始表c有如下字段:
id、tenant_id、type, classifiy1_id
按type、classify1_id 逆序排序:
select id, tenant_id, type, classify1_id from dx_course order by type desc , classify1_id desc, id asc
结果如下:
2700 2 7 177
3048 49 7 177
3105 45 7 177
3106 45 7 177
3107 45 7 177
3130 2 7 177
3139 2 7 177
3141 20 7 177
3497 1 7 177
2737 2 7 108
2740 2 7 108
2780 2 7 108
2986 2 7 108
2990 2 7 108
3023 2 7 108
3024 2 7 108
3025 2 7 108
2699 2 7 56
2713 2 7 56
2697 2 7 18
2702 2 7 18
3137 20 7 18
3150 2 7 18
3163 2 7 18
3180 2 7 18
3192 2 7 18
3203 2 7 18
3503 2 7 18
2277 2 6 367
2278 2 6 367
3151 2 6 367
3153 2 6 367
3156 2 6 367
3161 2 6 367
3190 2 6 367
2665 2 6 177
2666 2 6 177
2749 2 6 177
3006 45 6 177
3007 2 6 177
3010 2 6 177
3038 2 6 177
3042 45 6 177
3046 45 6 177
3051 2 6 177
3110 2 6 177
3119 2 6 177
3140 1 6 177
3145 1 6 177
2115 2 6 109
2117 2 6 109
2118 2 6 109
2199 20 6 109
2200 20 6 109
2267 2 6 109
2302 2 6 109
2064 2 6 108
2066 2 6 108
2075 2 6 108
2076 1 6 108
2089 1 6 108
2095 2 6 108
2187 2 6 108
2191 2 6 108
2195 20 6 108
2196 20 6 108
2201 2 6 108
�按tenant_id分组, 在按type、classify1_id逆序排序
select tenant_id, type, classify1_id from dx_course group by tenant_id order by type desc , classify1_id desc
46 6 18
49 6 18
50 2 108
9 2 25
16 2 23
24 2 18
1 2 9
21 2 3
31 2 0
35 1 91
3 1 34
33 1 25
34 1 18
45 1 18
20 1 17
2 1 9
可以看到,结果与我们想要的不一样,还丢了一些type=7的数据,是因为MySQL Group by后直接取第一条数据,这个取第一条数据默认的顺序是按分组字段排序的,因此第一条数据结果是不准确的。
我们的需求是:分组后也需要按type、classify1_id来排序,此时可以用Max函数来解决。
原因是:分组后,通过Max函数最后就是取的Max对应的那一条记录,示例如下:
select tenantid, _max(type) as t, max(classify1_id) as c
from dx_course group by tenant_id order by t desc, c desc;
结果如下:
2 7 367
1 7 177
45 7 177
49 7 177
20 7 177
33 6 177
34 6 169
46 6 18
24 6 18
3 4 109
9 3 34
50 2 177
16 2 23
21 2 3
31 2 0
35 1 177
最后基于分组+排序后的结果可直接做分页取数即可。