正好想寫一條刪除重復語句並保留一條數據的SQL,網上查了一部分資料寫的很詳細,但還是在這里寫下自己的理解,以遍后續學習 。如下:
表字段和數據:
SQL語句:
理解:
先從里面的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 分組的列名) 別名)
效果如下:
轉自:http://blog.csdn.net/dsiori/article/details/52806709