mysql去重保留最后一个_MySQL-去重留一
問題:
去除MySQL中重復的記錄,僅保留其中一條。本例中cname為重復項,而cid為primary key。
嘗試解決:
使用代碼:
DELETE FROMt_customerWHERE 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;
運行以后也得到了想要的結果。
總結
以上是生活随笔為你收集整理的mysql去重保留最后一个_MySQL-去重留一的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做试管婴儿失败怎么办
- 下一篇: 最开心的微信网名女生