我有这两张桌子:
测试( ID , suma ),其值如下:
的 1,1
的 1,2
的 2,3
的 2,4
的 2,5
的 3,6
的 3,7
的 3,8
的 3,9
付款( ID ,金额),其中包含以下值:
1,5
1,7
1,11
2,14
2,3
3,4
3,
我需要做的是只更新测试表中每个id的第一个发生,并根据id更新第二个表中的总和(金额)。
到目前为止,我有这个,但它会更新所有发生的事件而不是每个id的第一个:
UPDATE test SET test.suma = (SELECT SUM(amount) FROM payments WHERE payments.id = test.id)
如果我添加 LIMIT 1 ,它只会更新第一个ID的第一行。我需要它来更新每个id的第一行(第一行1,第一行2,第一行3)
答案 0 :(得分:1)
这个假设您的表id
中没有多个suma
和 test
,如果您这样做,那就没问题了两者都更新了。
它还假设"第一"一个是suma
最低的那个。除非您使用order by
子句指定一个,否则关系表中没有顺序。
UPDATE test t
INNER JOIN (
SELECT id, SUM(amount) amount FROM payments GROUP BY id
) p ON p.id = t.id
INNER JOIN (
SELECT id, MIN(suma) suma FROM test GROUP BY id
) st ON t.id = st.id AND t.suma = st.suma
SET t.suma = p.amount;
答案 1 :(得分:1)
未经过测试
尝试此代码,它将更新每行测试,其中id仅包含suma的最小值。 手段。它只会更新每个不同ID的第一列
UPDATE test SET test.suma = (SELECT SUM(amount) FROM payments
WHERE payments.id = (select test.id from test where suma = (select min(suma) from test)))