【问题标题】:MySQL, multiple table update and strange resultMySQL,多表更新和奇怪的结果
【发布时间】:2011-02-10 11:33:15
【问题描述】:

我有两张桌子:

测试1:

id int, value int, parentId int

和测试2:

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 值,并为 TEST2 中 parentId 与 TEST1 相似的记录添加 +1 值。

我的查询是:

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 的更新应该在同一条记录上发生 3 次。

为什么我得到 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 !而不是我预期的 4 个。

【问题讨论】:

    标签: mysql sql sql-update multiple-tables


    【解决方案1】:

    请尝试 RIGHT OUTER JOIN 而不是 LEFT OUT

    【讨论】:

    • 感谢您的回答,但我刚刚尝试过,这并没有改变任何东西。
    【解决方案2】:

    也许我在这里错了,但在查询完成之前,您的更新语句会将 t1.value 视为 0(因为您的查询尚未完成执行),这不是预期的行为吗?

    【讨论】:

    • 当然是这样,但我不想要这种行为,这就是问题所在;)
    【解决方案3】:

    这会做你想做的。
    它像你一样加入 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;
    

    【讨论】:

    • 我使用LEFT OUTER JOIN 作为示例开始。其实我觉得可能都是INNER JOIN
    • 我不能这样做,因为在我的实际情况下,我使用列而不是 1。示例:UPDATE TEST1 t1 LEFT OUTER JOIN TEST2 t2 ON t1.parentId=t2.parentId SET t1.value = t1 .value + 1, t2.value = t2.value + t1.value;
    • @Jerome:我将计数聚合更改为总和。从示例中不清楚您是指1*3 还是1+1+1。这行得通吗?
    猜你喜欢
    • 2015-07-04
    • 2014-10-26
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多