假如有个场景:
    需要先对表数据做分组,然后再排序,默认情况下,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

    结果如下:

    1. 2700 2 7 177
    2. 3048 49 7 177
    3. 3105 45 7 177
    4. 3106 45 7 177
    5. 3107 45 7 177
    6. 3130 2 7 177
    7. 3139 2 7 177
    8. 3141 20 7 177
    9. 3497 1 7 177
    10. 2737 2 7 108
    11. 2740 2 7 108
    12. 2780 2 7 108
    13. 2986 2 7 108
    14. 2990 2 7 108
    15. 3023 2 7 108
    16. 3024 2 7 108
    17. 3025 2 7 108
    18. 2699 2 7 56
    19. 2713 2 7 56
    20. 2697 2 7 18
    21. 2702 2 7 18
    22. 3137 20 7 18
    23. 3150 2 7 18
    24. 3163 2 7 18
    25. 3180 2 7 18
    26. 3192 2 7 18
    27. 3203 2 7 18
    28. 3503 2 7 18
    29. 2277 2 6 367
    30. 2278 2 6 367
    31. 3151 2 6 367
    32. 3153 2 6 367
    33. 3156 2 6 367
    34. 3161 2 6 367
    35. 3190 2 6 367
    36. 2665 2 6 177
    37. 2666 2 6 177
    38. 2749 2 6 177
    39. 3006 45 6 177
    40. 3007 2 6 177
    41. 3010 2 6 177
    42. 3038 2 6 177
    43. 3042 45 6 177
    44. 3046 45 6 177
    45. 3051 2 6 177
    46. 3110 2 6 177
    47. 3119 2 6 177
    48. 3140 1 6 177
    49. 3145 1 6 177
    50. 2115 2 6 109
    51. 2117 2 6 109
    52. 2118 2 6 109
    53. 2199 20 6 109
    54. 2200 20 6 109
    55. 2267 2 6 109
    56. 2302 2 6 109
    57. 2064 2 6 108
    58. 2066 2 6 108
    59. 2075 2 6 108
    60. 2076 1 6 108
    61. 2089 1 6 108
    62. 2095 2 6 108
    63. 2187 2 6 108
    64. 2191 2 6 108
    65. 2195 20 6 108
    66. 2196 20 6 108
    67. 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

    1. 46 6 18
    2. 49 6 18
    3. 50 2 108
    4. 9 2 25
    5. 16 2 23
    6. 24 2 18
    7. 1 2 9
    8. 21 2 3
    9. 31 2 0
    10. 35 1 91
    11. 3 1 34
    12. 33 1 25
    13. 34 1 18
    14. 45 1 18
    15. 20 1 17
    16. 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;

    结果如下:

    1. 2 7 367
    2. 1 7 177
    3. 45 7 177
    4. 49 7 177
    5. 20 7 177
    6. 33 6 177
    7. 34 6 169
    8. 46 6 18
    9. 24 6 18
    10. 3 4 109
    11. 9 3 34
    12. 50 2 177
    13. 16 2 23
    14. 21 2 3
    15. 31 2 0
    16. 35 1 177

    最后基于分组+排序后的结果可直接做分页取数即可。