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

如何将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;

原理说明

  1. 分组聚合:通过GROUP BY ID将同一用户的所有元数据行合并为一组。
  2. 提取对应字段:用CASE WHEN匹配每个meta_key,提取对应的meta_value;因为同一ID同一meta_key只有一条记录,其他行的该CASE结果为NULL,用MAX()聚合函数可以忽略NULL,得到唯一有效的值。
  3. 基础字段处理: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:35:34