首页 > 解决方案 > 如何在每个 GROUP BY 中排序

问题描述

我有这样的数据:

姓名 班级 位置
一种 5
1
一种 6
一种 1
4

所以现在我想在这个表上进行查询,按班级对所有学生进行分组,在每个班级中,学生将按索引降序排序。我的预期表格如下:

姓名 班级 位置
一种 6
一种 5
一种 1
4
1

这是我的查询

SELECT * FROM 
(
    SELECT * 
    from
    (
        SELECT 'Nam' as name, "A" as class, 5 as pos
        UNION 
        SELECT 'Hung' as name, "B" as class, 1 as pos
        UNION 
        SELECT 'Tran' as name, "A" as class, 6 as pos
        UNION 
        SELECT 'Hoang' as name, "A" as class, 1 as pos
        UNION 
        SELECT 'Bao' as name, "B" as class, 4 as pos
    )t0
    ORDER BY pos DESC
)t1 
GROUP BY name, class

但输出看起来如此不同:

姓名 班级 位置
一种 5
1
一种 6
一种 1
4

如果我只过滤 A 类,它看起来像

姓名 班级 位置
一种 1
一种 6
一种 5

仅适用于 B 类:

姓名 班级 位置
4
1

看起来子查询中的顺序在 group by 之后无法保留。我的最终查询将如下所示:

SELECT class as Class, COLLECT_LIST(name) as Name FROM 
(
    SELECT * 
    from
    (
        SELECT 'Nam' as name, "A" as class, 5 as pos
        UNION 
        SELECT 'Hung' as name, "B" as class, 1 as pos
        UNION 
        SELECT 'Tran' as name, "A" as class, 6 as pos
        UNION 
        SELECT 'Hoang' as name, "A" as class, 1 as pos
        UNION 
        SELECT 'Bao' as name, "B" as class, 4 as pos
    )t0
    ORDER BY pos DESC
)t1 
GROUP BY class

如果GROUP BY可以在子查询中保持基于 pos 的顺序,那么COLLECT_LIST将产生如下预期结果:

班级 姓名
一种 [Tran、Nam、Hoang]
[鲍洪]

如何在每个组中对内部进行分组和排序?

谢谢

标签: mysqlsql

解决方案


如果我正确理解您的要求,您只需要先按类进行两级排序,然后按索引:

SELECT Class, GROUP_CONCAT(Name ORDER BY Pos DESC) AS Name
FROM yourTable
GROUP BY Class
ORDER BY Class;

推荐阅读