如何将users_temp表中同ID不同meta值合并到users表?
解决方法:行转列插入数据
你的问题核心是要将users_temp表中同一ID的多行元数据,转换为users表中的单行多列结构。你之前的SQL没有做分组处理,导致每条记录单独生成一行,大部分字段为NULL,无法合并成目标格式。
正确的SQL语句
INSERT INTO users (ID, user_pass, user_nicename, user_registered, description, first_name, last_name, icon, theme, gender) SELECT ID, MAX(user_pass) AS user_pass, MAX(user_nicename) AS user_nicename, MAX(user_registered) AS user_registered, MAX(CASE WHEN meta_key = 'description' THEN meta_value END) AS description, MAX(CASE WHEN meta_key = 'first_name' THEN meta_value END) AS first_name, MAX(CASE WHEN meta_key = 'last_name' THEN meta_value END) AS last_name, MAX(CASE WHEN meta_key = 'icon' THEN meta_value END) AS icon, MAX(CASE WHEN meta_key = 'theme' THEN meta_value END) AS theme, MAX(CASE WHEN meta_key = 'gender' THEN meta_value END) AS gender FROM users_temp GROUP BY ID;
原理说明
- 分组聚合:通过
GROUP BY ID将同一用户的所有元数据行合并为一组。 - 提取对应字段:用
CASE WHEN匹配每个meta_key,提取对应的meta_value;因为同一ID同一meta_key只有一条记录,其他行的该CASE结果为NULL,用MAX()聚合函数可以忽略NULL,得到唯一有效的值。 - 基础字段处理:
user_pass、user_nicename等基础字段同一ID下值相同,用MAX()(或MIN()、ANY_VALUE())即可取出正确值。
可选优化(针对支持PIVOT的数据库)
如果你的数据库支持PIVOT语法(比如SQL Server、Oracle),也可以用更简洁的写法:
INSERT INTO users (ID, user_pass, user_nicename, user_registered, description, first_name, last_name, icon, theme, gender) SELECT ID, user_pass, user_nicename, user_registered, description, first_name, last_name, icon, theme, gender FROM users_temp PIVOT ( MAX(meta_value) FOR meta_key IN (description, first_name, last_name, icon, theme, gender) ) AS PivotTable GROUP BY ID, user_pass, user_nicename, user_registered;
内容的提问来源于stack exchange,提问作者Brad Cruise
相关产品推荐
相关产品推荐

