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

如何将多行SQL数据合并为一行?附当前使用的SQL查询语句

解决多行SQL数据合并为一行的问题

看起来你是想把同一个开发者对应的不同自定义字段(Github、Repository、Twitter)从多行结果合并成单行展示对吧?你的当前查询用了CASE语句,但因为关联了xf_user_field_value表(该表通常是一行存储一个用户的一个自定义字段值),所以会返回多条重复基础信息、仅自定义字段不同的记录。下面给你一个通用且高效的解决方案:

方法:聚合函数 + GROUP BY

这是跨数据库通用的方案,利用MAX()(或MIN())聚合函数提取同一用户的非空自定义字段值,再通过GROUP BY将同一用户的多行记录合并为一行:

SELECT 
    ps.developer,
    xu.username,
    xu.email,
    xup.homepage,
    xup.location,
    xup.about,
    -- 提取Github字段值,无则为空
    MAX(CASE WHEN xufv.field_id = 'Github' THEN xufv.field_value ELSE '' END) AS Github,
    -- 提取Repository字段值,无则为空
    MAX(CASE WHEN xufv.field_id = 'Repository' THEN xufv.field_value ELSE '' END) AS Repository,
    -- 提取Twitter字段值,无则为空
    MAX(CASE WHEN xufv.field_id = 'twitter' THEN xufv.field_value ELSE '' END) AS Twitter
FROM package_stats ps
-- 关联用户表,确保开发者与用户对应
JOIN xf_user xu ON xu.username = ps.developer
-- 关联用户资料表
JOIN xf_user_profile xup ON xup.user_id = xu.user_id
-- 左关联自定义字段表,避免过滤掉无自定义字段的用户
LEFT JOIN xf_user_field_value xufv 
    ON xufv.user_id = xu.user_id
    AND xufv.field_id IN ('Github', 'Repository', 'twitter')
-- 按用户唯一标识及基础信息分组
GROUP BY 
    ps.developer,
    xu.username,
    xu.email,
    xup.homepage,
    xup.location,
    xup.about;

关键说明:

  • LEFT JOIN的作用:如果某个用户没有填写Github/Repository/Twitter这些字段,依然会保留该用户的基础信息,不会被过滤掉;如果用INNER JOIN,没有自定义字段的用户会被排除。
  • MAX()聚合的逻辑:同一用户的每个自定义字段只有一行有值,其他行对应位置都是空字符串,MAX()会自动取出那个非空的有效值,实现多行合并。
  • 分组字段优化:如果xf_user.user_id是主键且唯一标识用户,你可以把GROUP BY改为仅按xu.user_id分组(数据库支持的话),这样更高效,也能避免因字段重复导致的分组错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:32:11