mysql刪除重復記錄并且只保留一條的實現(xiàn)方法
準備的測試表結(jié)構及數(shù)據(jù)
插入的數(shù)據(jù)中A,B,E存在重復數(shù)據(jù),C沒有重復記錄
CREATE TABLE `tab` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of tab -- ---------------------------- INSERT INTO `tab` VALUES ('1', 'A'); INSERT INTO `tab` VALUES ('2', 'A'); INSERT INTO `tab` VALUES ('3', 'A'); INSERT INTO `tab` VALUES ('4', 'B'); INSERT INTO `tab` VALUES ('5', 'B'); INSERT INTO `tab` VALUES ('6', 'C'); INSERT INTO `tab` VALUES ('7', 'B'); INSERT INTO `tab` VALUES ('8', 'B'); INSERT INTO `tab` VALUES ('9', 'B'); INSERT INTO `tab` VALUES ('10', 'E'); INSERT INTO `tab` VALUES ('11', 'E'); INSERT INTO `tab` VALUES ('12', 'E');
使用HAVING關鍵字篩選出表中重復數(shù)據(jù)
SELECT `name`,COUNT(1) FROM TAB GROUP BY `name` HAVING COUNT(1) >1
可以通過分組語句從每種重復數(shù)據(jù)中都拿出一條標識
SELECT `name`,id FROM TAB GROUP BY `name` HAVING COUNT(1) >1
刪除重復記錄并且只保留一條 [留意SQL注釋]
DELETE from tab where -- 刪除所有的重復時間 Begin -- `name` in ( SELECT * from (SELECT `name`FROM TAB GROUP BY `name` HAVING COUNT(1) >1) tmp2 ) -- 刪除所有的重復時間 END -- -- 但一些特定ID的記錄不進行刪除 Begin -- AND id NOT in( select id from ( SELECT `name`,id FROM TAB GROUP BY `name` HAVING COUNT(1) >1 ) tmp1 ) -- 但一些特定ID的記錄不進行刪除 END --
執(zhí)行后最終結(jié)果
方法二
MySql如何刪除所有多余的重復數(shù)據(jù)
方法一查詢出的所有多余的重復記錄:
方法二查詢出的所有多余的重復記錄(與方法一的結(jié)果相同):
方法三查詢出的所有多余的重復記錄:這里方法三因為用了MAX()方法(也可改用MIN()),查詢結(jié)果記錄的id不太一樣,但也可以被視為重復多余的數(shù)據(jù),關鍵是你希望選擇保留哪一條記錄而已。
MySql如何刪除所有多余的重復數(shù)據(jù) 需要處理的數(shù)據(jù),如:
出現(xiàn)重復的數(shù)據(jù),如:
先用SELECT查詢看看結(jié)果:
-- 方法一 SELECT * FROM t_user WHERE user_name IN ( SELECT user_name FROM t_user GROUP BY user_name HAVING COUNT(1)>1 ) AND id NOT IN ( SELECT MIN(id) FROM t_user GROUP BY user_name HAVING COUNT(1)>1 )
方法一查詢出的所有多余的重復記錄:
-- 方法二 SELECT * FROM t_user WHERE id NOT IN ( SELECT MIN(id) FROM t_user GROUP BY user_name )
方法二查詢出的所有多余的重復記錄(與方法一的結(jié)果相同):
-- 方法三 SELECT * FROM t_user AS t1 WHERE t1.id <> ( SELECT MAX(t2.id) FROM t_user AS t2 WHERE t1.user_name=t2.user_name )
方法三查詢出的所有多余的重復記錄:
這里方法三因為用了MAX()方法(也可改用MIN()),查詢結(jié)果記錄的id不太一樣,但也可以被視為重復多余的數(shù)據(jù),關鍵是你希望選擇保留哪一條記錄而已。
下面是對上面的SELECT語句稍作修改并加入了DELETE
-- 方法一(笨方法但容易理解) DELETE FROM t_user WHERE user_name IN ( SELECT t1.user_name FROM ( -- 查詢出所有重復的user_name SELECT user_name FROM t_user GROUP BY user_name HAVING COUNT(1)>1 ) t1 ) AND id NOT IN ( SELECT t2.min_id FROM ( -- 查詢出所有重復的記錄并各自只取其中一條(MIN(id)或MAX(id)都可以) SELECT MIN(id) AS min_id FROM t_user GROUP BY user_name HAVING COUNT(1)>1 ) t2 ) -- 方法二(推薦方法也容易理解) DELETE FROM t_user WHERE id NOT IN ( SELECT t.min_id FROM ( -- 過濾出重復多余的數(shù)據(jù),比如,如果所有記錄中存在1條記錄是user_name=zhangsan的,那么就取出它; -- 如果所有記錄中存在多條記錄是user_name=lisi的,那么只取其中1條,其他的不查詢出來 SELECT MIN(id) AS min_id FROM t_user GROUP BY user_name ) t ) -- 方法三(推薦方法但不太容易理解) DELETE FROM t_user WHERE id IN ( SELECT t.id FROM ( -- 1. 關于所有存在相同user_name的記錄,只查詢出(保留)重復記錄中的1條,假設這樣查詢出來的集合為A集合。 -- 2. 在所有記錄中,只要id不在A集合中的,都把它們查詢出來 SELECT t1.id FROM t_user AS t1 WHERE t1.id <> (SELECT MAX(t2.id) FROM t_user AS t2 WHERE t1.user_name=t2.user_name) ) t ) -- 或 DELETE FROM t_user t1 WHERE t1.id <> ( SELECT t2.max_id FROM ( SELECT MAX(t3.id) AS max_id FROM t_user t3 WHERE t1.user_name=t3.user_name ) t2 )
最后刪除成功之后,顯示數(shù)據(jù)已經(jīng)沒有重復的了
參考:
如何實現(xiàn) MySQL 中通過SQL語句刪除重復記錄并且只保留一條記錄
到此這篇關于mysql刪除重復記錄并且只保留一條的實現(xiàn)方法的文章就介紹到這了,更多相關mysql刪除重復記錄 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
windows下mysql 5.7.20 安裝配置方法圖文教程
這篇文章主要為大家詳細介紹了windows下mysql 5.7.20 安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09java實現(xiàn)mysql自動更新創(chuàng)建時間與更新時間的兩種方式
在實際開發(fā)中,每條數(shù)據(jù)的創(chuàng)建時間和修改時間,盡量不需要應用程序去記錄,而由數(shù)據(jù)庫獲取當前時間自動記錄創(chuàng)建時間,本文主要介紹了java實現(xiàn)mysql自動更新創(chuàng)建時間與更新時間的兩種方式,感興趣的可以了解一下2024-01-01