MySql數據庫去除重複的數據

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

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

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

select * from a group by cardno having count(cardno) > 1
查詢結果如下:
MySql數據庫去除重複的數據
查詢出來的是所有重複數據的第一條記錄,但是這個是我們需要保留的,所以條件變成了,(改用如下的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)
MySql數據庫去除重複的數據
這些記錄是我們需要刪除的,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))
執行結果如下:
MySql數據庫去除重複的數據
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的性能,同時如果大家有更好的方式不妨直接在下方留下評論,我們共同探討。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章