首頁 > 軟體

Mysql 刪除重複資料保留一條有效資料(最新推薦)

2023-02-09 06:01:49

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 --

執行後最終結果

方法二

MySql如何刪除所有多餘的重複資料

方法一查詢出的所有多餘的重複記錄:

方法二查詢出的所有多餘的重複記錄(與方法一的結果相同):

方法三查詢出的所有多餘的重複記錄:這裡方法三因為用了MAX()方法(也可改用MIN()),查詢結果記錄的id不太一樣,但也可以被視為重複多餘的資料,關鍵是你希望選擇保留哪一條記錄而已。

MySql如何刪除所有多餘的重複資料 需要處理的資料,如:

出現重複的資料,如:

先用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 刪除重複資料內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com