問題:
去除MySQL中重復的記錄,僅保留其中一條。本例中cname為重復項,而cid為primary key。
嘗試解決:
使用代碼:
DELETE FROM t_customer WHERE cname in ( SELECT cname FROM t_customer GROUP BY cname HAVING count(cname)>1 ) AND cid NOT IN ( SELECT min(cid) cid FROM t_customer GROUP BY cname HAVING count(cname)>1 )
代碼思路:
設置2個條件,1是查出cname相同的記錄里的cname值,2是查出cname相同的記錄里cid最小的一項記錄的cid值,然后據此進行刪除cname重復的記錄,保留其中cid最小的記錄。
運行以后發現:
報錯:[HY000][1093] You can't specify target table 't_customer' for update in FROM clause
報錯原因:(找了幾篇博客看來的)大意是:不能在同一條語句中對某個字段進行判斷的同時,又對其進行update操作。有博主還提到“這個問題只出現於MySQL,MSSQL和Oracle不會出現此問題”(未驗證過,在此只是提一句)
最后解決:
1種代碼:
DELETE FROM t_customer WHERE cname in ( SELECT cname FROM ( SELECT cname FROM t_customer GROUP BY cname HAVING count(cname)>1 ) t1 ) AND cid NOT IN ( SELECT cid FROM ( SELECT min(cid) cid FROM t_customer GROUP BY cname HAVING count(cname)>1 ) t2 )
思路:
將之前的2個查詢結果先暫存為t1和t2,然后從這2個臨時集合中查詢出cname和cid作為刪除條件
第2中代碼:
看其他的博客看到的:
DELETE t_customer FROM t_customer, ( SELECT min(cid) cid, cname FROM t_customer GROUP BY cname HAVING count(cname)>1 )t WHERE t_customer.cname=t.cname AND t_customer.cid>t.cid;
運行以后也得到了想要的結果。