我正在寻找创建一个更新大量数据的sql语句。
我所拥有的是像
这样的表格id, transid, amount, narative1, narative 2, total, active
1 1234 23.2 NULL NULL NULL 1
2 1234 120.33 NULL NULL NULL 1
3 1235 98.00 NULL NULL NULL 1
如果有两行具有相同的transid,我需要总计将结果放在第一个的总列中,并将第二个数量放在第一个实例的naritive2中,并使第二个数量为非活动状态。它应该忽略transid的单行。
我想做的结果应该是:
id, transid, amount, narative1, narative 2, total, active
1 1234 23.2 NULL 120.33 143.53 1
2 1234 120.33 NULL NULL NULL 0
3 1235 98.00 NULL NULL NULL 1
我知道有点丁字裤,但是......
理想情况下,我只想在MySQL语句中执行此操作。所以我不介意做多个sql语句,但我想避免将它连接到PHP等。它是一个非常大的数据集。
答案 0 :(得分:3)
这将仅更新具有2
行(不是1
而非3
或更多行)的交易。
UPDATE mytable mtu
JOIN (
SELECT minid, maxid, mtmin.amount AS minamt, mtmax.amount AS maxamt
FROM (
SELECT MIN(id) AS minid, MAX(id) AS maxid
FROM mytable mti
GROUP BY
transid
HAVING COUNT(*) = 2
) mt
JOIN mytable mtmin
ON mtmin.id = minid
JOIN mytable mtmax
ON mtmax.id = maxid
) mts
ON id IN (minid, maxid)
SET narative2 = CASE id WHEN minid THEN minamt ELSE NULL END,
total = CASE id WHEN minid THEN minamt + maxamt ELSE NULL END,
active = (id = minid)