MySQL行转列时varchar字段无法使用SUM函数的解决问题
MySQL 字符类型字段行转列解决方案
问题原因
当前语句返回结果异常的核心原因是:对user_id分组后,未给meta_value对应的判断列添加聚合函数,MySQL默认只会返回分组后第一条记录的匹配值,因此仅第一个出现的nickname字段有返回值,其余字段均为NULL。
针对meta_value为varchar类型无法使用SUM聚合的场景,可使用MAX()/MIN()函数替代,因为同一个用户ID下同一个meta_key仅对应唯一一条记录,MAX()/MIN()会直接返回该唯一字符串值,不会产生逻辑错误。
正确实现代码
SELECT user_id, MAX(CASE WHEN meta_key = 'nickname' THEN meta_value ELSE NULL END) AS nickname, MAX(CASE WHEN meta_key = 'first_name' THEN meta_value ELSE NULL END) AS first_name, MAX(CASE WHEN meta_key = 'last_name' THEN meta_value ELSE NULL END) AS last_name, MAX(CASE WHEN meta_key = 'description' THEN meta_value ELSE NULL END) AS description FROM user_table GROUP BY user_id;
扩展说明
如果业务场景中存在同一个user_id同一个meta_key对应多条meta_value的情况,可以根据需求调整聚合逻辑:
- 需拼接所有值:使用
GROUP_CONCAT(CASE WHEN meta_key = 'xxx' THEN meta_value END SEPARATOR ',') - 需取最新的值:可先按
umeta_id倒序排序后再分组,或者关联子查询取最大umeta_id对应的记录
内容的提问来源于stack exchange,提问作者Raghavendra Gupta
相关产品推荐
相关产品推荐

