问题:我想更新与左连接(或其他快速解决方案)不匹配的行。 初始目标:更新mytable1的记录,其中state = 0且具有匹配mytable2的(XOR!)列“a”,或匹配mytable2的列“b”(“a”和“b”不应匹配!)。将两个表的记录设置为state = 5。
我试过(并且失败了):
update mytable1 as t1
left join mytable2 as t2 on (t1.a=t2.a and t1.b=t2.b)
set t1.state=5,t2.state=5
where t1.state=0 and t2.state=0 and t2.a is null;
正如您所看到的,我尝试连接所有与BOTH值匹配的记录,以便我可以更新不匹配的记录,还可以更新mytable2中不匹配的行。来自mytable1的行会更新,但不会更新来自table2的行。我可以更新与左连接匹配的行,但这是99%的行,这是我认为的性能命中(我确实问过这个问题所以我从来没有比较过;)。
感谢您的时间。
答案 0 :(得分:0)
这样的事情应该这样做:
UPDATE `mytable1`
JOIN `mytable2` ON `mytable1`.`state` = `mytable2`.`state`
AND
(
(`mytable1`.`a` = `mytable2`.`a` AND `mytable1`.`b` != `mytable2`.`b`) OR
(`mytable1`.`b` = `mytable2`.`b` AND `mytable`.`a` != `mytable2`.`a`)
)
SET `mytable1`.`state` = 5, `mytable2`.`state` = 5
WHERE `mytable1`.`state` = 0;
答案 1 :(得分:0)
以下是我提出的建议:
update mytable1 t1 inner join mytable2 t2 on (t1.a=t2.a or t1.b=t2.b or t2.c=t1.c) set t1.state=5,t2.state=5 where((cast(t1.a=t2.a as unsigned integer) + (cast(t1.b=t2.b as unsigned integer) + (cast(t1.c=t2.c as unsigned integer)) <3) and t1.state=0;
是的,最多2个值可能相等,只有1个不同。
它看起来很有效,而且很快。有评论吗?