-- 處理IEMI重複的歷史數據,建檔日期(只有年月日)倒序,檔案ID倒序,根據IMEI查檔案,查詢的結果,相同IMEI下的第一條記錄的IEMI不處理,其餘的記錄的imei 改成空。數據庫
-- USE `testdb`;選擇對應的數據庫名稱 -- 建立存儲過程proc_UpdateIMEIUser /*判斷是否存在,若是存在就刪除*/ DROP PROCEDURE IF EXISTS `proc_UpdateIMEIUser`; DELIMITER $$ CREATE DEFINER=`root`@`%` PROCEDURE `proc_UpdateIMEIUser`(IN valIMEI VARCHAR(100)) BEGIN DECLARE temNumber INT DEFAULT 0; DECLARE TempUserID INT; /*每條記錄循環時的臨時ID*/ DECLARE isDone INT DEFAULT 0; /*判斷是否還有記錄*/ DECLARE UpdateIMEICursor CURSOR FOR SELECT UserID FROM `sysUser` WHERE IMEI =valIMEI ORDER BY CreateDate DESC,UserID DESC;/*遊標處理*/ DECLARE CONTINUE HANDLER FOR NOT FOUND SET isDone = 1;/*若是不存在就設置爲1,即爲true*/ OPEN UpdateIMEICursor; /*OPEN*/ REPEAT /*開始循環數據*/ FETCH UpdateIMEICursor INTO TempUserID; IF NOT isDone THEN IF temNumber > 0 THEN UPDATE sysUser SET IMEI='' WHERE UserID=TempUserID; END IF; SET temNumber=temNumber+1; END IF; UNTIL isDone END REPEAT; CLOSE UpdateIMEICursor;/*CLOSE,對應上面的open IMEICursor;*/ END $$ DELIMITER ; -- 建立存儲過程 proc_IMEIUser /*判斷是否存在,若是存在就刪除*/ DROP PROCEDURE IF EXISTS `proc_IMEIUser`; DELIMITER $$ CREATE DEFINER=`root`@`%` PROCEDURE `proc_IMEIUser`() BEGIN DECLARE valIMEI VARCHAR(100); /*每條記錄循環時的臨時IMEI*/ DECLARE isDone INT DEFAULT 0; /*判斷是否還有記錄*/ DECLARE IMEICursor CURSOR FOR SELECT IMEI FROM `sysUser` WHERE IsDel = 0 AND IMEI <>'' AND IMEI IS NOT NULL GROUP BY IMEI HAVING COUNT(*) > 1; DECLARE CONTINUE HANDLER FOR NOT FOUND SET isDone = 1;/*若是不存在就設置爲1,即爲true*/ OPEN IMEICursor; /*OPEN*/ REPEAT /*開始循環數據*/ FETCH IMEICursor INTO valIMEI; IF NOT isDone THEN CALL proc_UpdateIMEIUser(valIMEI); END IF; UNTIL isDone END REPEAT; CLOSE IMEICursor;/*CLOSE,對應上面的open IMEICursor;*/ END $$ DELIMITER ; -- 執行存儲過程處理IMEI的重複數據 CALL proc_IMEIUser(); /*使用完畢後要刪除存儲過程*/ DROP PROCEDURE proc_UpdateIMEIUser; DROP PROCEDURE proc_IMEIUser;
注意:建檔日期只有年月日, 並且有修改的入口,因此才先將建檔日期倒序,檔案ID倒序,最新的數據排在前面。spa
若是建檔日期有年月日 時分秒,而且不能修改建檔日期,那麼能夠去最大的檔案ID就是最新的,能夠直接寫update腳原本處理,注意須要執行屢次,以下:code
UPDATE `sysUser` a,(SELECT MIN(UserID) AS UserID FROM `sysUser` WHERE IsDel = 0 AND IMEI IS NOT NULL AND IMEI <>'' GROUP BY IMEI HAVING COUNT(*) > 1) b SET a.IMEI ='' WHERE a.IsDel = 0 AND a.`UserID` = b.UserID;