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

MySQL实现B表非重复数据插入A表的正确SQL语句咨询

问题原因
  • 你原有SQL使用了无关联条件的多表查询(笛卡尔积),没有将同一post_id对应的user-id和user-fullname进行匹配,导致不同post_id的字段值随意组合,最终返回行数远超预期。
  • 你不需要重复两次查询user-id,同一个user-id的meta_value可以同时赋值给user_login和user_email两个字段。
正确SQL语句

仅插入指定post_id(18181、18782)的写法

INSERT INTO users (user_login, user_email, display_name)
SELECT 
    MAX(CASE WHEN meta_key = 'user-id' THEN meta_value END) AS user_login,
    -- 如果你需要邮箱为标准格式可改为CONCAT(meta_value, '@xxx.com'),直接用user-id值就去掉CONCAT
    MAX(CASE WHEN meta_key = 'user-id' THEN meta_value END) AS user_email,
    MAX(CASE WHEN meta_key = 'user-fullname' THEN meta_value END) AS display_name
FROM postmeta
WHERE post_id IN (18181, 18782)
  AND meta_key IN ('user-id', 'user-fullname')
GROUP BY post_id
-- 过滤缺少必填字段的无效数据,同时判断避免插入重复记录
HAVING user_login IS NOT NULL 
  AND display_name IS NOT NULL
  AND NOT EXISTS (
    SELECT 1 FROM users d 
    WHERE d.user_login = MAX(CASE WHEN meta_key = 'user-id' THEN meta_value END)
);

插入所有post_id<5500的写法

只需要把上述代码WHERE条件中的post_id过滤规则修改即可:

WHERE post_id < 5500
  AND meta_key IN ('user-id', 'user-fullname')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:57:05