You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用MySQL查询生成带分组表头与详情的结果集?

问题描述

现有两个数据表:Person表和Documents表,表结构及数据如下:

Person表

姓名年龄部门
AFME45IT
HSAM55HR
MAMK35Design

Documents表

姓名文档名称份数是否完成
HSAMBirthCe1True
HSAMID1False
AFMEBirthCe1True
AFMEID1True

需要编写MySQL查询语句,生成如下格式的结果集:每个人员的基本信息作为分组表头行,后续行展示该人员对应的文档详情,空列留空:

目标结果集

姓名年龄部门文档名称份数是否完成
AFME45IT
AFMEBirthCe1True
AFMEID1True
HSAM55HR
HSAMBirthCe1True
HSAMID1False

解决方案

可以通过**联合查询(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;

补充说明

  1. 使用UNION ALL而非UNION,避免去重操作破坏结果结构;
  2. 新增sort_order字段控制排序逻辑,保证表头行先于详情行显示;
  3. 如果需要保留无文档记录的人员表头行(比如示例中的MAMK),去掉表头行查询中的WHERE EXISTS条件即可。

内容的提问来源于stack exchange,提问作者Ahmed F. Mostafa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:25:11