美好的一天,
我有一个MySQL表,它有一些重复的行,在将重复行中的一列添加到原始行时,必须将其删除。
当另一列具有错误的值并且现在已修复但是它将余额分配到必须添加在一起的不同行之间时,会导致该问题。然后必须删除添加的新行。
在此示例中,userid列确定它们是否重复(或重复)。用户标识6重复,用户标识3重复三次。
作为用户ID 3的示例,它必须将第3,11和13行中的所有余额相加,并且必须将该总数放入第3行,然后删除第11行和第13行。两者的平衡列必须是添加到原始的较低ID行中,必须删除较新的较高ID行。
ID | balance | userid
---------------------
1 | 10 | 1
2 | 15 | 2
3 | 300 | 3
4 | 80 | 4
5 | 0 | 5
6 | 65 | 6
7 | 178 | 7
8 | 201 | 8
9 | 92 | 9
10 | 0 | 10
11 | 140 | 3
12 | 46 | 6
13 | 30 | 3
我希望这很清楚,并且我提供了足够的信息。谢谢=)
答案 0 :(得分:2)
SELECT SUM(balance)
FROM your_table
GROUP BY userid
应该有效,但评论说修复表确实是最好的方法。
答案 1 :(得分:2)
两个步骤。
<强> 1。更新强>
UPDATE
tableX AS t
JOIN
( SELECT userid
, MIN(id) AS min_id
, SUM(balance) AS sum_balance
FROM tableX
GROUP BY userid
) AS c
ON t.userid = c.userid
SET
t.balance = CASE WHEN t.id = c.min_id
THEN c.sum_balance
ELSE 0
END ;
<强> 2。删除额外的行:
DELETE t
FROM
tableX AS t
JOIN
( SELECT userid
, MIN(id) AS min_id
FROM tableX
GROUP BY userid
) AS c
ON t.userid = c.userid
AND t.id > c.min_id
WHERE
t.balance = 0 ;
解决后,最好在UNIQUE
上添加userid
约束,因为您似乎希望在此处为每个用户存储余额。这将避免将来出现任何重复。您还可以删除(无用?)id
列。
答案 2 :(得分:1)
您可以创建具有相同结构的表,并使用此查询将数据传输到该表
insert into newPriceTable(id, userid, balance)
select u.id, p.userid, sum(balance) as summation
from price p
join (
select userid, min(id) as id from price group by userid
) u ON p.userid = u.userid
group by p.userid
在这里播放查询:http://sqlfiddle.com/#!2/4bb58/2
答案 3 :(得分:0)
工作主要在MSSQL中完成,但您应该能够转换语法。
使用GROUP BY UserID,您可以SUM()余额,将其连接回主表以更新所有重复项的余额。最后,您可以使用RANK()来订购重复的Userid并仅保留最早的值。
我将所有这些选择到一个新表中,如果它看起来不错,请弃用旧表并重命名然后重新命名。