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

MySQL单表行转列:将用户多邮箱数据水平展示的实现方法

解决MySQL行转列:将同一用户的多个邮箱转为单行多列

嘿,这个需求我熟,就是把同一用户的多行邮箱记录转成一行多列的格式对吧?刚好每个用户固定4条记录,用MySQL的分组加条件聚合就能完美解决,给你写个现成的SQL:

SELECT 
    user_Id,
    MAX(CASE WHEN rn = 1 THEN email END) AS email1,
    MAX(CASE WHEN rn = 2 THEN email END) AS email2,
    MAX(CASE WHEN rn = 3 THEN email END) AS email3,
    MAX(CASE WHEN rn = 4 THEN email END) AS email4
FROM (
    SELECT 
        user_Id,
        email,
        -- 给每个用户的邮箱按id排序分配序号
        ROW_NUMBER() OVER(PARTITION BY user_Id ORDER BY id) AS rn
    FROM your_table_name -- 这里替换成你的实际表名
) AS ranked_emails
GROUP BY user_Id
ORDER BY user_Id;

代码细节说明:

  • 内层子查询:用ROW_NUMBER()窗口函数,按user_Id分组,给每个用户的邮箱记录按id排序分配1-4的序号(rn),这样每条邮箱记录都有了自己在所属用户里的位置。
  • 外层查询:按user_Id分组,用MAX(CASE...)的组合,把对应序号的邮箱映射到email1到email4列上。因为每个序号每个用户只有一条记录,MAX函数其实就是取那个唯一的邮箱值,换成MIN也一样能用。
  • 如果你的邮箱排序不是按id,可以把ORDER BY id改成你需要的排序规则,比如ORDER BY email按邮箱字母顺序排列。

这个写法针对每个用户固定4条记录的场景非常稳定,要是以后有用户记录数不固定的情况,可能需要动态生成列,但当前需求下这个方案完全够用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:36:14