国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

一條sql語句完成MySQL去重留一

2024-07-24 12:50:48
字體:
供稿:網(wǎng)友

前幾天在做一個(gè)需求的時(shí)候,需要清理mysql中重復(fù)的記錄,當(dāng)時(shí)的想法是通過代碼遍歷寫出來,然后覺得太復(fù)雜,心里想著應(yīng)該可以通過一個(gè)sql語句來解決問題的。查了資料,請教了大佬之后得出了一個(gè)很便利的sql語句,這里分享下這段sql語句和思路。

需求分析

數(shù)據(jù)庫中存在重復(fù)記錄,刪除保留其中一條(是否重復(fù)判斷基準(zhǔn)為多個(gè)字段)

解決方案

碰到這個(gè)需求的時(shí)候,心里大概是有思路的。最快想到的是可以通過一條sql語句來解決,無奈自己對于復(fù)雜sql語句的道行太淺,所以想找大佬幫忙。

找人幫忙

因?yàn)檫@個(gè)需求有點(diǎn)著急,所以最開始想到的是,可以找這方面的同行來解決,然后分享這個(gè)問題給同事,結(jié)果這貨隨便百度了一下,就甩給我一個(gè)從未用過的sql語句,讓我自己嘗試,心里萬匹那啥啥啥奔騰而過...

自己百度

找到了一條sql語句:

DELETEFROM vitae aWHERE (a.peopleId, a.seq) IN ( SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 )AND rowid NOT IN ( SELECT min(rowid) FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1)

這條語句是在 【MySQL中刪除重復(fù)數(shù)據(jù)只保留一條】 這篇文章里找到的。這條sql思路很明顯,有以下3步:

SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 查詢出表中重復(fù)記錄作為條件

SELECT min(rowid) FROM vitae GROUP BY peopleId, seq HAVING count(*) > 1 查詢出表中重復(fù)記錄中ID最小的值為第二個(gè)條件

最后根據(jù)以上兩個(gè)條件,刪除 除 重復(fù)記錄中最小ID的其余重復(fù)記錄

但是很無奈的是,運(yùn)行這條語句出現(xiàn)了錯(cuò)誤,大致報(bào)錯(cuò)意思是,不能在查詢的時(shí)候同時(shí)更新這個(gè)表。

代碼解決

根據(jù)上面這個(gè)sql語句想到或許可以通過代碼的方式,兩步來達(dá)到同樣的目的:

先取出重復(fù)的數(shù)據(jù)集

根據(jù)查詢到的數(shù)據(jù)集,循環(huán)刪除其余的重復(fù)數(shù)據(jù)

想法是有了,寫出來也很快,但是一運(yùn)行嚇我一跳,竟然需要 116s 左右,然后自己就想一定要找到可以使用的sql語句,貼一下代碼和運(yùn)行結(jié)果:

完美的【去重留一】SQL

最后在一個(gè)技術(shù)群里得到了完美的答案,看這條sql語句:

DELETE consum_recordFROM consum_record, ( SELECT min(id) id, user_id, monetary, consume_time FROM consum_record GROUP BY user_id, monetary, consume_time HAVING count(*) > 1 ) t2WHERE consum_record.user_id = t2.user_id and consum_record.monetary = t2.monetary and consum_record.consume_time = t2.consume_timeAND consum_record.id > t2.id;
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 甘洛县| 九江县| 惠州市| 镇康县| 莲花县| 竹山县| 酉阳| 益阳市| 城口县| 游戏| 浮梁县| 小金县| 湘潭县| 阳原县| 嘉鱼县| 钟山县| 临沂市| 海晏县| 腾冲县| 安庆市| 酒泉市| 绥滨县| 秭归县| 乌兰县| 黔东| 丹凤县| 图木舒克市| 宁津县| 泌阳县| 紫金县| 五华县| 乌兰察布市| 台前县| 白河县| 讷河市| 内乡县| 石台县| 商水县| 德清县| 开化县| 万载县|