0

重複の可能性:
MySQLテーブルの重複を削除する方法

プレーンテキストファイルにあるデータをmysqlデータベースにインポートしました。削除したいエントリが重複していることがわかりました。重複は、主キーではないキーによって識別されます。重複したアイテムの1つを保持する必要があることに注意してください。

テーブルT1には、3つの重複があります。例:

ID(一意、主キー)REAL_ID(char(11))

1 '01234567890'
2 '01234567891'
3 '01234567891'
4 '01234567891'
..。

今、私は使用します

 SELECT ID AS x, COUNT(*) AS y FROM T1 GROUP BY x HAVING y>1;

重複を識別するため。結果i

+ ------ + ------------- +
| ID | REAL_ID |
+ ------ + ------------- +
| 1 | 01234567891 |
| 2 | 01234567891 |
| 3 | 01234567891 |
+ ------ + ------------- +

削除する必要のあるIDのリストを作成することもできます。

SELECT ID 
FROM T1 
  RIGHT JOIN ( (SELECT ID AS x, COUNT(*) AS y 
                FROM T1 
                GROUP BY x 
                HAVING y>1) AS T2 ) ON (T2.x=T1.REAL_ID) LIMIT 1,100;

結果は

+ ------ + ------------- +
| ID | REAL_ID |
+ ------ + ------------- +
| 2 | 01234567890 |
| 3 | 01234567890 |
+ ------ + ------------- +

今、私はこれらのエントリを削除する方法についての助けが必要です。

DELETEをサブクエリと組み合わせて使用​​することはできないため、REAL_ID列の重複するすべてのエントリにフラグを付けてから、

DELETE FROM T1 WHERE REAL_ID='flag';

しかし、これらのエントリにフラグを立てる方法がわかりません。

4

1 に答える 1

0

あなたはこれを行うことができます:

DELETE t
FROM T1 t 
RIGHT JOIN 
( 
   SELECT ID, COUNT(*) AS y 
   FROM T1 
   GROUP BY ID
   HAVING y > 1 
) AS T2 ON T2.ID = t.REAL_ID;

更新:から引用されているように、複数のテーブルから削除する場合はLIMIorを使用できないことに注意してください:ORDER BYDELETE

複数テーブル構文の場合、DELETE は各 tbl_name から条件を満たす行を削除します。この場合、ORDER BY と LIMIT は使用できません。

代わりにこれを試してください:

DELETE t
FROM T1 t 
WHERE REAL_ID IN
( 
  SELECT t1.REAL_ID
  FROM T1 t1
  RIGHT JOIN 
  ( 
     SELECT ID, COUNT(*) AS y 
     FROM T1 
     GROUP BY ID
     HAVING y > 1 
  ) AS T2 ON T2.ID = t.REAL_ID
  WHERE t1.REAL_ID IS NOT NULL
  ORDER BY t2.y DESC
  LIMIT 1, 1000
)
于 2012-12-12T13:28:05.680 に答える