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

