0

我有桌子

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_id1,2 和 6,7 中重复。我需要从我的表中删除 2 和 7(总共 61 个重复条目)。如何使用 where 子句 vendor_id = 33 AND category_id = 4 的查询从表中删除重复条目?我不想删除其他重复条目,例如table_id8,9

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

4

5 回答 5

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 |

看到这个 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

看到这个 SQLFiddle

于 2013-08-06T07:10:54.150 回答
0

那这个呢:

DELETE FROM my_table
WHERE table_id NOT IN
    (SELECT MIN(table_id)
     FROM my_table
     GROUP BY item_id, vendor_id, category_id)
于 2013-08-06T07:07:55.013 回答
0
try below code...
DELETE FROM myTable
      WHERE table_ID NOT IN (SELECT   MAX (table_ID)
                           FROM myTable
                       GROUP BY table_ID
                         HAVING COUNT (*) > 1)
于 2013-08-06T07:26:48.510 回答
0

尝试

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演示

于 2013-08-06T07:57:46.393 回答
-1

从您的问题中,我想您需要删除 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

于 2013-08-06T07:16:19.783 回答