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
相关产品推荐
相关产品推荐

