2013-05-03 89 views
1

我有这样的表称为删除重复的条目:删除有2个相同的列项

+--------+----------+---------+----------+ 
| bag_id | chara_id | item_id | item_qty | 
+--------+----------+---------+----------+ 
|  1 |  1 |  2 |  22 | 
|  2 |  1 |  1 |  55 | 
|  3 |  3 |  1 |  2 | 
|  6 |  3 |  4 |  2 | 
|  7 |  4 |  4 |  2 | 
|  8 |  5 |  4 |  2 | 
|  9 |  6 |  4 |  2 | 
|  10 |  1 |  5 |  1 | 
|  11 |  1 |  2 |  1 | 
|  12 |  1 |  2 |  1 | 
|  13 |  1 |  2 |  1 | 
|  14 |  1 |  8 |  1 | 
|  15 |  1 |  6 |  1 | 
|  16 |  1 |  8 |  1 | 
|  17 |  1 |  6 |  1 | 
+--------+----------+---------+----------+ 

的关系都按1个甜心=许多项目 现在我不想1个恰拉=许多重复项目。

我怎样才能做一个查询,删除的重复值? 像chara_id:1有3个重复item_id:2 我想删除其他2.

回答

1

你可以简单的连接表bag使用子查询它获取的最低bag_idchara_IDitem_ID每个组合。在子查询的任何字段上具有空值的记录是将被删除的记录。

DELETE a 
FROM bag a 
     LEFT JOIN 
     (
      SELECT chara_ID, item_ID, MIN(bag_ID) min_ID 
      FROM bag 
      GROUP BY chara_ID, item_ID 
     ) b ON a.bag_ID = b.min_ID AND 
       a.chara_ID = b.chara_ID AND 
       a.item_ID = b.item_ID 
WHERE b.min_ID IS NULL 
+0

谢谢!荣誉再次@JW – Viscocent 2013-05-03 03:18:35

+0

不客气':)' – 2013-05-03 03:18:53

+0

我可以问另一个noob问题吗? :) – Viscocent 2013-05-03 03:45:23

2

不是最好的方式来做到这一点。但下面应该definetly工作:

Delete from Bag 
where bag_id 
     not in (
       select min(bag_id) from bag a, 
        (select chara_id, item_id 
         from bag group by chara_id, item_id 
          having count(*) > 1) b 
       where a.chara_id = b.chara_id and a.item_id = b.item_id 
       UNION 
       select bag_id from bag a, 
        (select chara_id, item_id 
         from bag group by chara_id, item_id 
          having count(*) = 1) b 
       where a.chara_id = b.chara_id and a.item_id = b.item_id 
     )