我有两个表,其中包含以下结构和示例内容。表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;
答案 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