4

良い一日、

複製された行の 1 つの列から元の列に値を追加するときに、削除する必要がある重複した行がいくつかある MySQL テーブルがあります。

この問題は、別の列に間違った値が含まれていたときに発生し、現在は修正されていますが、合計する必要があるさまざまな行に残高が分割されたままになっています。追加された新しい行は削除する必要があります。

この例では、userid 列によって重複 (または 3 重複) かどうかが判別されます。ユーザー ID 6 は複製され、ユーザー ID 3 は 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

二段。

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 に答える
2
SELECT SUM(balance)
FROM your_table
GROUP BY userid

うまくいくはずですが、テーブルを修正するというコメントが実際には最良のアプローチです。

于 2013-02-07T22:17:28.067 に答える
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 に答える