列具有相同条目时删除双行

时间:2014-06-08 17:32:27

标签: php mysql sql delete-row sql-delete

我有一个带有自动增量列(id)的数据库表(test_table),当3个特定列(A,B,C)具有相同的条目时,我想删除所有双(或更多)条目。

    id    column_A    column_B    column_C
------------------------------------------------
    1     ooo         aaa         uuu
    2     ooo         aaa         uuu
    3     ttt         ppp         uuu
    4     ooo         aaa         uuu
    5     iii         kkk         ccc

在此示例中,执行 DELETE 查询后,应删除ID为 2 4 的行。

问候。

4 个答案:

答案 0 :(得分:3)

DELETE FROM tbl
WHERE `id` NOT IN ( SELECT * FROM (
                                SELECT MIN(`id`) 
                                FROM tbl
                                GROUP BY `column_A`
                                       , `column_B`
                                       , `column_C` 
                              ) x
              )

SQLFiddle

答案 1 :(得分:1)

你可以在删除查询中使用自联接,联接中的子查询将加入重复的行,条件t.id > tt.id将保留最小的id记录,其他重复项将被删除

delete t.* from t
join (
select * from t 
group by `column_A`, `column_B`, `column_C`
having count(*) > 1
) tt 
  on(t.`column_A` = tt.`column_A`
          AND t.`column_B` = tt.`column_B`
          AND t.`column_C` = tt.`column_C` 
         AND t.id > tt.id)

我已经添加了另外一个第5行的副本来测试它

Demo

答案 2 :(得分:0)

我很快就从https://www.linkedin.com/groups/How-delete-duplicate-rows-in-78638.S.218942398借用了这个:

  

步骤1:将非重复项(唯一元组)移动到临时表

CREATE TABLE new_table AS
SELECT * FROM old_table WHERE 1 GROUP BY [COLUMN TO remove duplicates BY];
     

第2步:删除旧表

DROP TABLE old_table;
     

步骤3:将new_table重命名为old_table的名称

RENAME TABLE new_table TO old_table;

然后你可以编辑新表,让A列成为主键,不再发生任何欺骗。

答案 3 :(得分:0)

DELETE x
  FROM t x
  LEFT
  JOIN
     ( SELECT column_a
            , column_b
            , column_c
            , MIN(id) min_id
         FROM t
        GROUP 
           BY column_a
            , column_b
            , column_c
     ) y
    ON y.column_a = x.column_a
   AND y.column_b = x.column_b
   AND y.column_c = x.column_c
   AND y.min_id = x.id
 WHERE y.min_id IS NULL 

http://www.sqlfiddle.com/#!2/b1b679/1