MySQL如何将列的值一起添加并删除重复的行?

时间:2013-02-07 22:12:09

标签: mysql sql

美好的一天,

我有一个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

我希望这很清楚,并且我提供了足够的信息。谢谢=)

4 个答案:

答案 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并仅保留最早的值。

我将所有这些选择到一个新表中,如果它看起来不错,请弃用旧表并重命名然后重新命名。

http://sqlfiddle.com/#!3/068ee/2