mysql - 如何在每个 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] |
乙 | [鲍洪] |
如何在每个组中对内部进行分组和排序?
谢谢
解决方案
如果我正确理解您的要求,您只需要先按类进行两级排序,然后按索引:
SELECT Class, GROUP_CONCAT(Name ORDER BY Pos DESC) AS Name
FROM yourTable
GROUP BY Class
ORDER BY Class;
推荐阅读
- c - 为什么 gmtime_r 和 localtime_r 返回同一时间?
- javascript - 如何在具有 Cordova 的蓝牙低功耗 (BLE) 设备上使用当前时间服务 (CTS) 设置时间?
- c# - 无法将本机 .dll 引用添加到源生成器项目
- javascript - 聚焦时如何更改 Ionic 5 中的输入字段颜色?
- javascript - JS Canvas - 使用 FadeIn 模糊文本(移动)
- linux - systemctl enable 失败并显示神秘的错误消息
- findbugs - SpotBugs:自定义检测器
- java - 如何使用共享首选项保存评分?
- python - 将列表项转换为小写
- spring - Spring Boot 应用程序不接受传入 POST 请求的 ID