Mysql?刪除重復數據保留一條有效數據(最新推薦)
Mysql 刪除重復數據保留一條有效數據
一、Mysql 刪除重復數據,保留一條有效數據
DELETE FROM SZ_Building WHERE id NOT IN (
SELECT t.min_id FROM (
SELECT MIN(id) AS min_id FROM SZ_Building GROUP BY BLDG_NO
) t
)
;原理:
根據字段對數據進行分組,查詢出所有分組的最小ID(即要保留的不重復數據)將查詢出來的數據(所有不重復的數據)存放到臨時表中從原來的表中刪除ID不在臨時表中的重復數據
二、Mysql 刪除重復數據(多個字段分組)
DELETE FROM SZ_Water_Level WHERE id NOT IN (
SELECT t.min_id FROM (
SELECT MIN(id) AS min_id FROM SZ_Water_Level GROUP BY CZBM,SJ,SW
) t
)
;三、Mysql 查詢出可以刪除的重復數據
SELECT * FROM SZ_Building WHERE BLDG_NO IN ( SELECT BLDG_NO FROM SZ_Building GROUP BY BLDG_NO HAVING COUNT(1)>1 ) AND id NOT IN ( SELECT MIN(id) FROM SZ_Building GROUP BY BLDG_NO HAVING COUNT(1)>1 ) ;
補充:mysql刪除重復記錄并且只保留一條
準備的測試表結構及數據
插入的數據中A,B,E存在重復數據,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關鍵字篩選出表中重復數據
SELECT `name`,COUNT(1) FROM TAB GROUP BY `name` HAVING COUNT(1) >1

可以通過分組語句從每種重復數據中都拿出一條標識
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í)行后最終結果

方法二
MySql如何刪除所有多余的重復數據
方法一查詢出的所有多余的重復記錄:
方法二查詢出的所有多余的重復記錄(與方法一的結果相同):
方法三查詢出的所有多余的重復記錄:這里方法三因為用了MAX()方法(也可改用MIN()),查詢結果記錄的id不太一樣,但也可以被視為重復多余的數據,關鍵是你希望選擇保留哪一條記錄而已。
MySql如何刪除所有多余的重復數據 需要處理的數據,如:

出現(xiàn)重復的數據,如:

先用SELECT查詢看看結果:
-- 方法一 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 )
方法二查詢出的所有多余的重復記錄(與方法一的結果相同):

-- 方法三 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()),查詢結果記錄的id不太一樣,但也可以被視為重復多余的數據,關鍵是你希望選擇保留哪一條記錄而已。
下面是對上面的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 (
-- 過濾出重復多余的數據,比如,如果所有記錄中存在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
)最后刪除成功之后,顯示數據已經沒有重復的了
到此這篇關于Mysql 刪除重復數據保留一條有效數據的文章就介紹到這了,更多相關Mysql 刪除重復數據內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MySQL可直接使用的查詢表的列信息(實現(xiàn)方案)
本文介紹了如何使用SQL快速將下劃線命名的表字段轉換為駝峰命名格式,包括確定下劃線位置、找到第一個字符、截取并拼接字符串等步驟,通過使用LOCATE、CONCAT、UCASE和LOWER等函數,可以實現(xiàn)高效的字段命名轉換,感興趣的朋友跟隨小編一起看看吧2025-01-01
zabbix監(jiān)控MySQL主從狀態(tài)的方法詳解
這篇文章主要介紹了zabbix--監(jiān)控MySQL主從狀態(tài)的方法,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-06-06

