首页 > 解决方案 > 将值从 B 表插入到在 mysql 中不重复的 A 表中

问题描述

我有 2 张桌子 A,B

表 A

user_login  user_email          display_name
--------------------------------------------------
btv1        btv1@chodoixe.com   Bien tap vien 1
btv2        btv2@chodoixe.com   Bien tap vien 2

表 B

meta_id post_id meta_key         meta_value
-------------------------------------------
83758   18181   user-id          108538      <---- insert to user_login, user_email
83759   18181   user-fullname    nguyen dang <---- insert to display_name
83760   18181   user-phone       329420797
83761   18181   car-firm         vinfast
83762   18181   car-model        lux-a20
88974   18782   user-id          24561      <---- insert to user_login, user_email
88975   18782   user-fullname    a hoc      <---- insert to display_name
88976   18782   user-phone       943902211
88977   18782   car-firm         kia
88978   18782   car-model        morning

我想将表 B 的 user-id 的 meta_value、post_id='18181'、'18782' 的 user-fullname 插入表 A 的 user_login、user_email、display_name

我下面的查询返回超过 100,000 个插入的行。但是用户表中大约有 1,300 行必须插入 postmeta 表

INSERT INTO users(
    user_login,
    user_email,
    display_name
)
select a.meta_value, b.meta_value, c.meta_value from
    (
    SELECT
        meta_value
    FROM
        `postmeta`
    WHERE
        `meta_key` = 'user-id' AND post_id < 5500
) a,
 (
    SELECT
        meta_value
    FROM
        `postmeta`
    WHERE
        `meta_key` = 'user-id' AND post_id < 5500
) b,
(
    SELECT
        meta_value
    FROM
        `postmeta`
    WHERE
        `meta_key` = 'user-fullname' AND post_id < 5500
) c
where not exists (select d.user_login, d.user_email, d.display_name from users d where d.user_login=a.meta_value)

请给我真正的查询

太感谢了 !!!

标签: mysql

解决方案


您可以简单地Table B在相同post_idmeta_key等于上连接自身,然后在右连接表等于user-fullname的地方过滤选择meta_keyuser-id

INSERT INTO `Table A` (`user_login`, `user_email`, `display_name`)
SELECT
    `UserIds`.`meta_value` AS `user_login`,
    `UserIds`.`meta_value` AS `user_email`,
    `UserFullNames`.`meta_value` AS `display_name`
FROM `Table B` AS `UserIds`
INNER JOIN `Table B` AS `UserFullNames` 
    ON `UserFullNames`.`post_id` = `UserIds`.`post_id`
    AND `UserFullNames`.`meta_key` = 'user-fullname'
WHERE `UserIds`.`meta_key` = 'user-id'

推荐阅读