MySQL更新列,其中包含来自不同表的值

时间:2016-06-23 10:43:18

标签: mysql

我有两个表,其中包含以下结构和示例内容。表1将membership_no设置为正确的值,但表2在membership_no列中具有一些不正确的值。我需要查询两个表并检查membership_no值何时不相等,然后使用表1中的值更新表2的membership_no列。

表一:

id     membership_no
====================
800960 800960
800965 800965

表二:

id     membership_no
====================
800960 800970
800965 800975

到目前为止更新查询。它没有捕获表2中的所有不正确的值。

UPDATE
tabletwo
    INNER JOIN
    tableone ON tabletwo.id = tableone.id
SET 
    tabletwo.membership_no = tableone.membership_no;

编辑:包括对不匹配的membership_no列值的SHOW CREATE和SELECT查询。

表一显示:

CREATE TABLE `n2z7m3_kiduka_accounts_j15` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`membership_no` int(11) NOT NULL,
...
`membershipyear` varchar(100) NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `user_id` (`user_id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=800987 DEFAULT CHARSET=utf8

表2显示:

CREATE TABLE `n2z7m3_kiduka_accounts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`membership_no` int(11) NOT NULL,
...
`membershipyear` varchar(100) NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `user_id` (`user_id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=801072 DEFAULT CHARSET=utf8

对不匹配的membership_no列值的SELECT查询:

SELECT 
    u.name,
    a.membership_no as 'Joomla 1.5 accounts table', 
    j.membership_no as 'Joomla 3.0 accounts table' 
FROM 
    n2z7m3_kiduka_accounts_j15 AS a 
    INNER JOIN n2z7m3_users AS u ON a.user_id = u.id
    INNER JOIN n2z7m3_kiduka_accounts AS j ON a.user_id = j.membership_no 
    and a.membership_no != j.membership_no
ORDER BY u.name;

2 个答案:

答案 0 :(得分:2)

虽然Tim's Answer完全有效,但另一种变体是将过滤器限定符添加到ON子句中,以便:

UPDATE tabletwo
INNER JOIN
tableone ON tabletwo.id = tableone.id AND tabletwo.membership_no <> tableone.membership_no
SET 
tabletwo.membership_no = tableone.membership_no;

这意味着您没有WHERE过滤器,因此它将处理所有行,但仅对具有不同membership_no值的行进行处理。因为它是INNER JOIN,结果将是表或没有表(Skipped / NULL结果)。

修改

如果您怀疑自己仍有问题,MySQL命令会响应什么,您是否有特定的错误通知?对于80k列,可能需要一段时间才能实际处理,因此您是否需要时间来完成,或者是PHP还是由于执行时间到期导致命令中止的系统? (更新你在PHP和MySQL上的执行时间,然后重新运行查询,看看是否导致它成功完成?

<强>建议

作为另一个消息,我认为您的UNIQUE KEY也应该是您的AI密钥,因此对于两个表:

DROP INDEX `user_id` ON <table> #removes the current unique index.

然后

CREATE UNIQUE INDEX `id` ON <table> #addes unique index to the A_I column.

答案 1 :(得分:1)

您只需添加WHERE子句:

UPDATE
    tabletwo
INNER JOIN
    tableone
    ON tabletwo.id = tableone.id
SET 
    tabletwo.membership_no = tableone.membership_no
WHERE tabletwo.membership_no <> tableone.membership_no