【问题标题】:Deleting duplicate entries with search criteria使用搜索条件删除重复条目
【发布时间】:2013-08-06 06:58:08
【问题描述】:

我有这样的桌子

table_id  item_id  vendor_id  category_id
   1         1       33           4
   2         1       33           4 
   3         1       33           2 
   4         2       33           4
   5         2       33           2
   6         3       33           4
   7         3       33           4 
   8         1       34           4 
   9         1       34           4 
   10        3       35           4 

这里table_id 是主键和表,共有 98000 个条目,包括我通过执行查询找到的 61 个重复条目

 SELECT * FROM my_table 
 WHERE vendor_id = 33 
 AND category_id = 4 
 GROUP BY item_id having count(item_id)>1

在上表table_id 1,2 和 6,7 重复。我需要从我的表中删除 2 和 7(总共 61 个重复条目)。如何使用 where 子句 vendor_id = 33 AND category_id = 4 的查询从表中删除重复条目?我不想删除其他重复条目,例如 table_id 8,9

我无法索引该表,因为我需要保留一些需要的重复条目。我需要删除符合某些条件的重复项

【问题讨论】:

标签: mysql sql duplicates duplicate-removal


【解决方案1】:

请始终在运行任何删除查询之前进行备份。

尝试像这样使用LEFT JOIN

DELETE my_table
  FROM my_table
  LEFT JOIN 
  (SELECT MIN(table_id) AS IDs FROM my_table
   GROUP BY `item_id`, `vendor_id`, `category_id`
  )A
  ON my_table.table_id = A.IDs
  WHERE A.ids IS NULL;

删除后的结果:

| TABLE_ID | ITEM_ID | VENDOR_ID | CATEGORY_ID |
------------------------------------------------
|        1 |       1 |        33 |           4 |
|        3 |       1 |        33 |           2 |
|        4 |       2 |        33 |           4 |
|        5 |       2 |        33 |           2 |
|        6 |       3 |        33 |           4 |

this SQLFiddle


编辑:(在 OP 编辑​​后)

如果要添加更多条件,可以在外部WHERE条件中添加,如下所示:

DELETE my_table
  FROM my_table
  LEFT JOIN 
  (SELECT MIN(table_id) AS IDs FROM my_table
   GROUP BY `item_id`, `vendor_id`, `category_id`
  )A
  ON my_table.table_id = A.IDs
  WHERE A.ids IS NULL
  AND vendor_id = 33   --< Additional conditions here
  AND category_id = 4  --< Additional conditions here

this SQLFiddle

【讨论】:

    【解决方案2】:

    这个呢:

    DELETE FROM my_table
    WHERE table_id NOT IN
        (SELECT MIN(table_id)
         FROM my_table
         GROUP BY item_id, vendor_id, category_id)
    

    【讨论】:

    • 对不起,我想到的是 mssql 而不是 mysql。
    【解决方案3】:
    try below code...
    DELETE FROM myTable
          WHERE table_ID NOT IN (SELECT   MAX (table_ID)
                               FROM myTable
                           GROUP BY table_ID
                             HAVING COUNT (*) > 1)
    

    【讨论】:

      【解决方案4】:

      试试

      DELETE m 
        FROM my_table m JOIN 
      (
        SELECT MAX(table_id) table_id
          FROM my_table 
         WHERE vendor_id = 33 
           AND category_id = 4 
         GROUP BY item_id, vendor_id, category_id 
        HAVING COUNT(*) > 1
      ) q ON m.table_id = q.table_id
      

      删除后会有

      |表 ID |项目 ID |供应商 ID |类别 ID | ------------------------------------------------ | 1 | 1 | 33 | 4 | | 3 | 1 | 33 | 2 | | 4 | 2 | 33 | 4 | | 5 | 2 | 33 | 2 | | 6 | 3 | 33 | 4 | | 8 | 1 | 34 | 4 | | 9 | 1 | 34 | 4 | | 10 | 3 | 35 | 4 |

      这里是SQLFiddle演示

      【讨论】:

        【解决方案5】:

        从您的问题中,我想您需要删除 item_id、vendor_id 和 category_id 具有相同值的重复行,例如 tabled_id 1 和 2 的行。因此可以通过使上述三列一起唯一来完成。所以试试下面的,

        alter ignore table table_name add unique index(item_id, vendor_id, category_id);
        

        注意:我还没有测试这个,有时间会给出 sqlfiddle

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-01-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-27
          • 1970-01-01
          • 2021-11-03
          • 1970-01-01
          相关资源
          最近更新 更多