Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL如何将列的值添加到一起并删除重复的行?_Mysql_Sql - Fatal编程技术网

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

MySQL如何将列的值添加到一起并删除重复的行?,mysql,sql,Mysql,Sql,你好 我有一个MySQL表,其中有一些重复的行,在将重复行中的一列中的值添加到原始行时,必须删除这些重复行 这个问题是由另一列的值错误引起的,现在已经解决了,但它使余额在不同的行之间分开,这些行必须相加。然后必须删除添加的较新行 ID | balance | userid --------------------- 1 | 10 | 1 2 | 15 | 2 3 | 300 | 3 4 | 80 | 4 5 | 0 | 5 6 | 6

你好

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

这个问题是由另一列的值错误引起的,现在已经解决了,但它使余额在不同的行之间分开,这些行必须相加。然后必须删除添加的较新行

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

以userid 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
我希望这足够清楚,并且我已经提供了足够的信息。谢谢=)


应该可以,但注释“修复表”确实是最好的方法。

您可以创建具有相同结构的表,并使用此查询将数据传输到该表

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

在这里绕过查询:

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

使用GROUP BY UserID,您可以对余额求和(),将其连接回主表,以更新所有重复项的余额。最后,您可以使用RANK()对重复的用户标识进行排序,并仅保留最早的值

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

两个步骤

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 ;
    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 ;
2。删除多余的行:

    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 ;
    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 ;


解决此问题后,最好在
userid
上添加
UNIQUE
约束,因为您似乎希望在此处存储每个用户的余额。这将避免将来出现任何重复。您还可以删除(无用?
id
列。

将其导出到excel。让它看起来正确。然后截断该表,并将其从现在正确的excel文件中以正确的方式放回。确保在处理iThanks时表没有任何更改,但不幸的是我不能这样做。表中的余额不断调整。因此,我认为一个纯粹的MySQL方法会是最好的。这只是向我展示了所有用户的平衡。这并不能解决我的问题。谢谢你的帮助谢谢你的回复。我不知道MSSQL,所以我不知道如何转换。另外,我不能真的放弃这个表,因为它是活动的。我不能用新表的设置方式。它可能会起作用,尽管不是这样。谢谢。太棒了,这太完美了。谢谢=)