4

私はこのようなテーブルを持っています:

mysql> SELECT * FROM Colors;
╔════╦══════════╦════════╦════════╦════════╦════════╦════════╦════════╗
║ ID ║ USERNAME ║  RED   ║ GREEN  ║ YELLOW ║  BLUE  ║ ORANGE ║ PURPLE ║
╠════╬══════════╬════════╬════════╬════════╬════════╬════════╬════════╣
║  1 ║ joe      ║ 1      ║ (null) ║ 1      ║ (null) ║ (null) ║ (null) ║
║  2 ║ joe      ║ 1      ║ (null) ║ (null) ║ (null) ║ 1      ║ (null) ║
║  3 ║ bill     ║ 1      ║ 1      ║ 1      ║ (null) ║ (null) ║ 1      ║
║  4 ║ bill     ║ (null) ║ 1      ║ (null) ║ 1      ║ (null) ║ (null) ║
║  5 ║ bill     ║ (null) ║ 1      ║ (null) ║ (null) ║ (null) ║ (null) ║
║  6 ║ bob      ║ (null) ║ (null) ║ (null) ║ 1      ║ (null) ║ (null) ║
║  7 ║ bob      ║ (null) ║ (null) ║ (null) ║ (null) ║ (null) ║ 1      ║
║  8 ║ bob      ║ 1      ║ (null) ║ (null) ║ (null) ║ (null) ║ (null) ║
╚════╩══════════╩════════╩════════╩════════╩════════╩════════╩════════╝

重複を見つけて削除し、結果としてこれで終わるようにレコードを統合するUPDATEandを実行したいと思います。DELETE

mysql> SELECT * FROM Colors;
╔════╦══════════╦═════╦════════╦════════╦════════╦════════╦════════╗
║ ID ║ USERNAME ║ RED ║ GREEN  ║ YELLOW ║  BLUE  ║ ORANGE ║ PURPLE ║
╠════╬══════════╬═════╬════════╬════════╬════════╬════════╬════════╣
║  1 ║ joe      ║   1 ║ (null) ║ 1      ║ (null) ║ 1      ║ (null) ║
║  3 ║ bill     ║   1 ║ 1      ║ 1      ║ 1      ║ (null) ║ 1      ║
║  6 ║ bob      ║   1 ║ (null) ║ (null) ║ 1      ║ (null) ║ 1      ║
╚════╩══════════╩═════╩════════╩════════╩════════╩════════╩════════╝

スクリプトを使用してこれを簡単に実行できることはわかっていますが、MySQLをよりよく学習して理解するために、pureを使用してこれを実行する方法を学びたいと思いますSQL

4

3 に答える 3

3

これは単なる予測です。テーブルを更新したり、一部のデータを削除したりすることはありません。

SELECT  MIN(ID) ID,
        Username,
        MAX(Red) max_Red,
        MAX(Green) max_Green,
        MAX(Yellow) max_Yellow,
        MAX(Blue) max_Blue,
        MAX(Orange) max_Orange,
        MAX(Purple) max_Purple
FROM    Colors
GROUP   BY Username

アップデート

これらのレコードを本当に削除する場合は、レコードを削除する前に、まずUPDATEステートメントを実行する必要があります。

UPDATE  Colors a
        INNER JOIN
        (
            SELECT  MIN(ID) min_ID,
                    Username,
                    MAX(Red) max_Red,
                    MAX(Green) max_Green ,
                    MAX(Yellow) max_Yellow,
                    MAX(Blue) max_Blue,
                    MAX(Orange) max_Orange,
                    MAX(Purple) max_Purple
            FROM    Colors
            GROUP   BY Username
        ) b ON a.ID = b.Min_ID 
SET     a.Red = b.max_Red,
        a.Green = b.max_Green,
        a.Yellow = b.max_Yellow,
        a.Blue = b.max_Blue,
        a.Orange = b.max_Orange,
        a.Purple = b.max_Purple

次に、レコードを削除できます。

DELETE  a
FROM    Colors a
        LEFT JOIN
        (
            SELECT  MIN(ID) min_ID,
                    Username
            FROM    Colors
            GROUP   BY Username
        ) b ON a.ID = b.Min_ID 
WHERE   b.Min_ID  IS NULL
于 2013-01-18T17:26:51.303 に答える
1

基になるテーブルを本当に更新する必要がありますか?そうでない場合(そして、例に示すように結果セットが必要な場合)、テーブルを単純にグループ化できます。

SELECT   MIN(ID)     AS ID,
         Username    AS Username,
         MAX(Red)    AS Red,
         MAX(Green)  AS Green,
         MAX(Yellow) AS Yellow,
         MAX(Blue)   AS Blue,
         MAX(Orange) AS Orange,
         MAX(Purple) AS Purple
FROM     Colors
GROUP BY Username

sqlfiddleでそれを参照してください。

于 2013-01-18T17:26:47.947 に答える
0
DELETE FROM Colors c1
WHERE EXISTS (SELECT 1
                FROM Colors c2
               WHERE c1.Username = c2.Username
                 AND ((c1.Red    IS NULL AND c2.Red    IS NULL) OR c1.Red    = c2.Red   )
                 AND ((c1.Green  IS NULL AND c2.Green  IS NULL) OR c1.Green  = c2.Green )
                 AND ((c1.Yellow IS NULL AND c2.Yellow IS NULL) OR c1.Yellow = c2.Yellow)
                 AND ((c1.Blue   IS NULL AND c2.Blue   IS NULL) OR c1.Blue   = c2.Blue  )
                 AND ((c1.Orange IS NULL AND c2.Orange IS NULL) OR c1.Orange = c2.Orange)
                 AND ((c1.Purple IS NULL AND c2.Purple IS NULL) OR c1.Purple = c2.Purple)
                 AND c2.ID < c1.ID
             )

NULL = NULLは真ではありませんが、SQLでは不明であるため、nullはこれを少し複雑にします。0と1の場合、カラー条件のORの前の部分は省略できます。

于 2013-01-18T17:34:28.140 に答える