2013-02-07 47 views
4

美好的一天,MySQL如何将列的值添加到一起并删除重复的行?

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

问题是由于另一列有错误的值而引起的,现在已解决,但它将不同行之间的天平分开,必须将它们相加。然后添加的新行必须被删除。

在此示例中,userid列确定它们是否重复(或重复)。用户ID 6被复制并且用户ID 3被重复三次。

作为用户标识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

将其导出为ex​​cel。使它看起来正确。然后截断表格并从现在正确的excel文件中恢复正确的方式。确保在工作时对桌子没有任何更改 –

+0

谢谢,但不幸的是我无法做到这一点。余额正在不断调整。我认为纯粹的MySQL做法是最好的,因为这一点。 – rykr

回答

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

+0

太棒了,这是完美的。谢谢=) – rykr

2
SELECT SUM(balance) 
FROM your_table 
GROUP BY userid 

应该可以工作,但修改表的评论说真的是最好的方法。

+0

这只是向我展示了所有用户的余额。它不能解决我遇到的问题。但是,感谢您的帮助=) – rykr

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

+0

我不能像安装它一样使用新表格。它可能可以工作,否则。谢谢。 – rykr

0

工作是在MSSQL主要是做,但你应该能够转换语法。

使用GROUP BY UserID,您可以SUM()余额,将它加回到主表以更新所有重复项的余额。最后,您可以使用RANK()来订购重复的Userids并仅保留最早的值。

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

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

+0

感谢您的回复。我不知道MSSQL,所以我不知道如何转换。另外,我不能真正放下桌子以来的生活。 – rykr

相关问题