如何用MySQL查询生成带分组表头与详情的结果集?
问题描述
现有两个数据表:Person表和Documents表,表结构及数据如下:
Person表
| 姓名 | 年龄 | 部门 |
|---|---|---|
| AFME | 45 | IT |
| HSAM | 55 | HR |
| MAMK | 35 | Design |
Documents表
| 姓名 | 文档名称 | 份数 | 是否完成 |
|---|---|---|---|
| HSAM | BirthCe | 1 | True |
| HSAM | ID | 1 | False |
| AFME | BirthCe | 1 | True |
| AFME | ID | 1 | True |
需要编写MySQL查询语句,生成如下格式的结果集:每个人员的基本信息作为分组表头行,后续行展示该人员对应的文档详情,空列留空:
目标结果集
| 姓名 | 年龄 | 部门 | 文档名称 | 份数 | 是否完成 |
|---|---|---|---|---|---|
| AFME | 45 | IT | |||
| AFME | BirthCe | 1 | True | ||
| AFME | ID | 1 | True | ||
| HSAM | 55 | HR | |||
| HSAM | BirthCe | 1 | True | ||
| HSAM | ID | 1 | False |
解决方案
可以通过**联合查询(UNION ALL)**结合排序规则实现需求,核心思路是先生成人员表头行,再生成对应文档详情行,最后通过排序字段确保表头行优先显示:
-- 生成人员表头行(仅展示个人基本信息,文档字段留空) SELECT p.Name AS 姓名, p.Age AS 年龄, p.Department AS 部门, '' AS 文档名称, '' AS 份数, '' AS 是否完成, 1 AS sort_order -- 标记为表头行,排序优先级更高 FROM Person p WHERE EXISTS (SELECT 1 FROM Documents d WHERE d.Name = p.Name) -- 仅保留有文档记录的人员 UNION ALL -- 生成文档详情行(仅展示文档信息,个人信息字段留空) SELECT d.Name AS 姓名, '' AS 年龄, '' AS 部门, d.DocName AS 文档名称, d.Papers AS 份数, d.Fulfilled AS 是否完成, 2 AS sort_order -- 标记为详情行,排序优先级更低 FROM Documents d -- 按姓名分组,同时确保表头行在该人员的文档行之前 ORDER BY 姓名, sort_order;
补充说明
- 使用
UNION ALL而非UNION,避免去重操作破坏结果结构; - 新增
sort_order字段控制排序逻辑,保证表头行先于详情行显示; - 如果需要保留无文档记录的人员表头行(比如示例中的MAMK),去掉表头行查询中的
WHERE EXISTS条件即可。
内容的提问来源于stack exchange,提问作者Ahmed F. Mostafa
相关产品推荐
相关产品推荐

