麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數據庫 > MySQL > 正文

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

2024-07-24 13:15:08
字體:
來源:轉載
供稿:網友

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

需求分析

數據庫中存在重復記錄,刪除保留其中一條(是否重復判斷基準為多個字段)

解決方案

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

找人幫忙

因為這個需求有點著急,所以最開始想到的是,可以找這方面的同行來解決,然后分享這個問題給同事,結果這貨隨便百度了一下,就甩給我一個從未用過的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中刪除重復數據只保留一條】 這篇文章里找到的。這條sql思路很明顯,有以下3步:

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

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

最后根據以上兩個條件,刪除 重復記錄中最小ID的其余重復記錄

但是很無奈的是,運行這條語句出現了錯誤,大致報錯意思是,不能在查詢的時候同時更新這個表。

代碼解決

根據上面這個sql語句想到或許可以通過代碼的方式,兩步來達到同樣的目的:

先取出重復的數據集

根據查詢到的數據集,循環刪除其余的重復數據

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

sql語句去重,distinct,去重的sql語句

sql語句去重,distinct,去重的sql語句

完美的【去重留一】SQL

最后在一個技術群里得到了完美的答案,看這條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;

上面這條sql語句,仔細看一下,揣摩出思路也不難,大概也分為3步來理解:

(SELECT min(id) id, user_id, monetary, consume_time FROM consum_record GROUP BY user_id, monetary, consume_time HAVING count(*) > 1 ) t2 查詢出重復記錄形成一個集合(臨時表t2),集合里是每種重復記錄的最小ID

consum_record.user_id = t2.user_id and consum_record.monetary = t2.monetary and consum_record.consume_time = t2.consume_time 關聯 判斷重復基準的字段

根據條件,刪除原表中id大于t2中id的記錄

看到這個語句的時候,心里想這也太厲害了。這么一個簡單的sql語句,竟然可以解決這么復雜的問題,漲姿勢了~

運行起來也超級快,原先的代碼循環執行,需要 116s 左右,而這里 0.3s 就可以了,厲害了~

sql語句去重,distinct,去重的sql語句

總結

作為一個php程序猿,按理來說sql這里是不能拖后腿的,無奈實際中,需要忙碌的事情太多,現在的sql水平也只是處于在一個普通的層次中,以后找機會一定要補一下這方面的知識。

今天就分享到這里啦。


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久久久久国产精品久久久久 | 人人看人人艹 | 久久久国产精品成人免费 | 在线观看精品视频 | 午夜爽爽爽男女免费观看hd | 可以看逼的视频 | 97久久日一线二线三线 | 国产精品久久久久久久亚洲按摩 | 毛片免费一区二区三区 | 欧美激情 在线播放 | 精品偷拍久久 | 久久99精品久久久久久秒播放器 | 免费国产自久久久久三四区久久 | 久久综合九色综合久久久精品综合 | 久久福利小视频 | 久久久综合久久久 | 国产精品一品二区三区四区18 | 在线观看91精品 | 99这里精品| 国产精品一二区 | 久久3| 极品大长腿啪啪高潮露脸 | 天天干天天透 | 今井夏帆av一区二区 | 91麻豆精品国产91久久久更新资源速度超快 | 国产精品午夜一区 | 99爱在线免费观看 | 精品国产一区二区三 | 黑人日比视频 | 日本xxxx色视频在线观看免费, | 又黄又爽免费无遮挡在线观看 | 久久精品视频16 | 色妞视频男女视频 | 深夜免费视频 | sesee99| 一级大片一级一大片 | 毛片一级免费看 | 免费看成人av | 秋霞a级毛片在线看 | 亚洲网站在线观看视频 | 一级在线观看视频 |