MySQL,多表更新和奇怪的结果

时间:2011-02-10 11:33:15

标签: mysql sql sql-update multiple-tables

我有两张桌子:

TEST1:

id int, value int, parentId int

和TEST2:

id int, value int, parentId int

在TEST1中,我有以下记录:

 id  value  parentId
 1   0      1
 2   0      1
 3   0      1
在TEST2中,我得到了:

id  value  parentId
1   0      1

我想使用多表功能在一次更新中更新两个表。 目标是将TEST1和+1值的每个记录添加+1值到TEST2中的记录,其中parentId类似于TEST1。

我的查询是:

UPDATE TEST1 t1
LEFT OUTER JOIN TEST2 t2 ON t1.parentId=t2.parentId
SET t1.value = t1.value + 1,
    t2.value = t2.value + 1;

之后,我选择检查TEST1的值是否已更新:

SELECT * FROM TEST1;

它给了我:

id  value  parentId
1   1      1
2   1      1
3   1      1

我检查了TEST2:

SELECT * FROM TEST2;

它给了我:

id  value  parentId
1   1      1

我觉得奇怪的是TEST2的记录值为1.我期望3,因为TEST1的更新是在3条记录上,所以TEST2的更新应该在同一条记录上发生三次。

为什么我获得1而不是3?什么是获得3的正确查询?

编辑:我也试过了:

SET @var=1;

UPDATE TEST1 t1
LEFT OUTER JOIN TEST2 t2 ON t1.parentId=t2.parentId
SET t1.value = t1.value + 1,
    t2.value = (@var:= @var + 1);

在此查询之后,t2.value等于2!而不是我所期望的那样。

3 个答案:

答案 0 :(得分:0)

请尝试RIGHT OUTER JOIN而不是LEFT OUT

答案 1 :(得分:0)

也许我在这里错了,但是在查询完成之前,你的update语句会将t1.value视为0(因为你的查询还没有完成执行),这是不是预期的行为?

答案 2 :(得分:0)

这将做你想做的事。
它正如你所做的那样加入TEST1和TEST2 在名为agg的子查询上进行额外连接,并在TEST1上进行总和聚合。

UPDATE TEST1 t1
LEFT OUTER JOIN TEST2 t2 ON t1.parentId=t2.parentId
LEFT OUTER JOIN (
  SELECT 
    parentId,
    sum(value) AS sum_v
  FROM TEST1
  GROUP BY parentId
) agg ON t1.parentId=agg.parentId
SET t1.value = t1.value + 1,
    t2.value = t2.value + agg.sum_v;