關於mysql中刪除重複記錄,並保留重複數據中的一條數據的SQL語句理解

正好想寫一條刪除重複語句並保留一條數據的SQL,網上查了一部分資料寫的很詳細,但還是在這裏寫下自己的理解,以遍後續學習 。如下:


表字段和數據: 


SQL語句: 

DELETE FROM `user` WHERE id NOT IN(SELECT * FROM(SELECT id FROM `user` GROUP BY username)AS b)

理解:

先從裏面的SQL開始看

1、SELECT id FROM `user` GROUP BY username  根據名字分組查詢出每組的ID。

2、SELECT * FROM(SELECT id FROM `user` GROUP BY username) AS b  這句話中有2個疑問點,

  第一、爲什麼要套這樣一個select?因爲 更新數據時使用了查詢,而查詢的數據又做更新的條件,mysql不支持這種方式

    如果不套上這個select查詢,那麼將會報1093 -  You can't specify target table 'user' for update in FROM clause錯誤。

第二、這句話中一定要取別名,不然會報1248 - Every derived table must have its own alias 錯誤

3、結合上面的分析來看一下整個的SQL語句理解,先將分組的ID查出來,然後刪除USER表中ID 不在分組ID中的數據,那麼就實現效果了。

delete from 表名 where  ID not in (select * from (select  id from 表名 group by 分組的列名)   別名)


效果如下:



發佈了22 篇原創文章 · 獲贊 35 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章