2013-05-03 51 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 
     )