假如有个场景:
需要先对表数据做分组,然后再排序,默认情况下,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 1773048 49 7 1773105 45 7 1773106 45 7 1773107 45 7 1773130 2 7 1773139 2 7 1773141 20 7 1773497 1 7 1772737 2 7 1082740 2 7 1082780 2 7 1082986 2 7 1082990 2 7 1083023 2 7 1083024 2 7 1083025 2 7 1082699 2 7 562713 2 7 562697 2 7 182702 2 7 183137 20 7 183150 2 7 183163 2 7 183180 2 7 183192 2 7 183203 2 7 183503 2 7 182277 2 6 3672278 2 6 3673151 2 6 3673153 2 6 3673156 2 6 3673161 2 6 3673190 2 6 3672665 2 6 1772666 2 6 1772749 2 6 1773006 45 6 1773007 2 6 1773010 2 6 1773038 2 6 1773042 45 6 1773046 45 6 1773051 2 6 1773110 2 6 1773119 2 6 1773140 1 6 1773145 1 6 1772115 2 6 1092117 2 6 1092118 2 6 1092199 20 6 1092200 20 6 1092267 2 6 1092302 2 6 1092064 2 6 1082066 2 6 1082075 2 6 1082076 1 6 1082089 1 6 1082095 2 6 1082187 2 6 1082191 2 6 1082195 20 6 1082196 20 6 1082201 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 1849 6 1850 2 1089 2 2516 2 2324 2 181 2 921 2 331 2 035 1 913 1 3433 1 2534 1 1845 1 1820 1 172 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 3671 7 17745 7 17749 7 17720 7 17733 6 17734 6 16946 6 1824 6 183 4 1099 3 3450 2 17716 2 2321 2 331 2 035 1 177
最后基于分组+排序后的结果可直接做分页取数即可。
