国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 略阳县| 铁岭市| 青河县| 台前县| 九龙坡区| 邵阳县| 运城市| 北辰区| 措勤县| 日土县| 浙江省| 巧家县| 台山市| 宁陵县| 廉江市| 湾仔区| 都江堰市| 尼勒克县| 无棣县| 长寿区| 油尖旺区| 五大连池市| 宁安市| 景东| 天镇县| 青河县| 紫金县| 石棉县| 浪卡子县| 中山市| 化德县| 略阳县| 宁阳县| 天等县| 修武县| 噶尔县| 安西县| 泾阳县| 荆门市| 泰顺县| 安康市|