1. 程式人生 > >MySql資料庫去除重複的資料

MySql資料庫去除重複的資料

今天群內有群友提出了一個問題,就是MySql中刪除重複資料的問題,然後回答了一下,發現正好接觸到了之前可能沒關注的一點兒小知識,在此做下簡要記錄(哦對,昨天晚上在試用騰訊雲資料庫的時候還遇到一個問題,就是騰訊雲資料庫的Mysql對大小寫是敏感的)。

OK,接下來我們進入正題,首先我按照群友的資料結構建立了一張表,填充了一部分資料,結構如下圖所示:


那麼我們首先來確定我們刪除資料的時候的所需條件,首先找到所有重複的資料記錄,使用如下sql語句進行

select * from a group by cardno having count(cardno) > 1
查詢結果如下:

查詢出來的是所有重複資料的第一條記錄,但是這個是我們需要保留的,所以條件變成了,(改用如下的sql語句查詢,根據cardno查詢)重複資料中不包含本條記錄的結果刪除:

下午寫的時候犯了個錯誤,這裡已經更正

 查詢語句如下:

select id,cardno from a where cardno in (select cardno from a group by cardno having count(cardno)>1)
and id not in(select min(id) from a group by cardno having count(cardno)>1)

這些記錄是我們需要刪除的,OK,接下來我們就直接刪除掉這些資料就OK了,我們根據id主鍵來刪除,sql語句如下:

delete from a where id in(select id from a where cardno in (select cardno from a group by cardno having count(cardno)>1)
and id not in(select min(id) from a group by cardno having count(cardno)>1))
執行結果如下:


Oops!報錯了,這條提示資訊說的是,誒同學,在MySql裡你不能先查詢瞭然後再刪除誒!哦,好吧,這個就只能等官方升級支援這個新特性了,但是我們現在就要解決這個棘手的問題啊,腫麼辦?我們用臨時表來解決,然後我們的刪除語句變成了,這個樣子:

delete from a where id in (select id from (select id from a where cardno in (select cardno from a group by cardno having count(cardno)>1)
and id not in(select min(id) from a group by cardno having count(cardno)>1)) as tmpresult)

執行,OK,可以看到我們上面查詢的出來要刪除的6條重複資料已經被清理掉了,結果如下:


OK,那麼群裡的那位朋友的問題是,他只想刪除固定的卡號的話該怎麼辦呢?

這個就相當於附加的條件篩選了,我們直接在臨時表的查詢裡附加條件:(注:紅色加粗字型是附加條件)
delete from a where id in (select id from (select id from a where cardno in (select cardno from a group by cardno having count(cardno)>1 <strong>and cardno=333</strong>)
and id not in(select min(id) from a group by cardno having count(cardno)>1)) as tmpresult)

這樣兒就完成了Mysql刪除重複資料的需求。

But,該語句尚未做系能測試,而且我這小菜兒暫時也沒有時間去做這個相關的工作了,留待以後抽時間專門研究下MySql的效能,同時如果大家有更好的方式不妨直接在下方留下評論,我們共同探討。

2014年10月12日23:40:58,EricTang記。