4

再会,

我有一个 MySQL 表,其中有一些重复的行必须删除,同时将重复行中的一列的值添加到原始表中。

问题是当另一列的值错误时引起的,现在已修复,但它使余额在必须添加在一起的不同行之间分裂。然后必须删除添加的较新行。

在此示例中,用户 ID 列确定它们是否重复(或三次)。用户标识 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

4 回答 4

2
SELECT SUM(balance)
FROM your_table
GROUP BY userid

应该可以,但是说修复表格的评论确实是最好的方法。

于 2013-02-07T22:17:28.067 回答
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列。

于 2013-02-07T22:34:54.890 回答
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

于 2013-02-07T22:31:13.720 回答
0

工作主要在 MSSQL 中完成,但您应该能够转换语法。

使用 GROUP BY UserID,您可以 SUM() 余额,将其加入主表以更新所有重复项的余额。最后,您可以使用 RANK() 对重复的用户 ID 进行排序并仅保留最早的值。

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

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

于 2013-02-07T22:31:17.860 回答