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

如何在MySQL中将同一房间的多行人员数据合并为单行多列展示

解决方法

方法一:MySQL 8.0+ 支持窗口函数版本(推荐)

先给每个房间内的入住人员分配序号,再通过条件聚合实现行转列:

WITH guest_ranked AS (
    SELECT 
        房间ID,
        first_name,
        last_name,
        dob,
        -- 按房间分组给客人分配序号,排序规则可按需调整
        ROW_NUMBER() OVER (PARTITION BY 房间ID ORDER BY 个人ID) AS guest_num
    FROM 你的表名
)
SELECT 
    房间ID,
    MAX(CASE WHEN guest_num = 1 THEN first_name END) AS Guest1_First,
    MAX(CASE WHEN guest_num = 1 THEN last_name END) AS Guest1_Last,
    MAX(CASE WHEN guest_num = 1 THEN dob END) AS Guest1_dob,
    MAX(CASE WHEN guest_num = 2 THEN first_name END) AS Guest2_First,
    MAX(CASE WHEN guest_num = 2 THEN last_name END) AS Guest2_Last,
    MAX(CASE WHEN guest_num = 2 THEN dob END) AS Guest2_dob,
    -- 按相同格式补充到guest_num=6即可
    MAX(CASE WHEN guest_num = 6 THEN first_name END) AS Guest6_First,
    MAX(CASE WHEN guest_num = 6 THEN last_name END) AS Guest6_Last,
    MAX(CASE WHEN guest_num = 6 THEN dob END) AS Guest6_dob
FROM guest_ranked
GROUP BY 房间ID;

方法二:MySQL 5.x 不支持窗口函数版本

通过用户变量实现序号分配:

SELECT 
    房间ID,
    MAX(CASE WHEN guest_num = 1 THEN first_name END) AS Guest1_First,
    MAX(CASE WHEN guest_num = 1 THEN last_name END) AS Guest1_Last,
    MAX(CASE WHEN guest_num = 1 THEN dob END) AS Guest1_dob,
    MAX(CASE WHEN guest_num = 2 THEN first_name END) AS Guest2_First,
    MAX(CASE WHEN guest_num = 2 THEN last_name END) AS Guest2_Last,
    MAX(CASE WHEN guest_num = 2 THEN dob END) AS Guest2_dob,
    -- 按相同格式补充到guest_num=6即可
    MAX(CASE WHEN guest_num = 6 THEN first_name END) AS Guest6_First,
    MAX(CASE WHEN guest_num = 6 THEN last_name END) AS Guest6_Last,
    MAX(CASE WHEN guest_num = 6 THEN dob END) AS Guest6_dob
FROM (
    SELECT 
        t.*,
        @num := IF(@room_id = t.房间ID, @num + 1, 1) AS guest_num,
        @room_id := t.房间ID
    FROM 你的表名 t,
    (SELECT @num := 0, @room_id := NULL) AS init
    ORDER BY t.房间ID, t.个人ID
) AS guest_ranked
GROUP BY 房间ID;

报错原因说明

你遇到的1055报错是因为MySQL开启了only_full_group_by模式,该模式要求GROUP BY查询中,SELECT列表里的非聚合字段必须全部出现在GROUP BY子句中,或者使用聚合函数包裹。上述方案所有非GROUP BY的字段都用了MAX聚合函数,完全符合该模式的要求,不会触发报错。

内容的提问来源于stack exchange,提问作者Shing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:24:03