MySQL用于删除重复的重复项

时间:2013-02-01 02:56:16

标签: mysql sql

我有一个表,其中有一些重复的文件访问信息,其中重复的文件访问被定义为同一个用户背靠背访问同一文件。换句话说,如果用户按该顺序访问文件A,B,A,则不认为它是重复的。所以基本上,每个用户我想确保每个后续访问都是针对与上一个文件不同的文件。

UserID  FileID
1       1
2       1
1       1   <-  Remove
2       1   <-  Remove
2       2
1       2
2       2   <-  Remove
1       1
1       2

任何人都知道如何在mysql中处理这样的事情?理想情况下,我想在不使用函数的情况下使用它,但如果它是唯一的选项,我会对函数开放。

该表包含以下列:ID(主键),userID,fileID,accessTime

2 个答案:

答案 0 :(得分:0)

如果您制作SPROC,它看起来就像这样。您可能需要另一个临时表和循环,因为当光标打开时DELETE语句可能会失败。

CREATE PROCEDURE `proc_CURSOR` ()  
BEGIN  
    CREATE TEMPORARY TABLE lastUserAccess;
    DECLARE cur1 CURSOR FOR SELECT userId, fileId, pkId FROM table1 ORDER BY time_stamp;  
    DECLARE a, b, c, d INT;  
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET a = 1;  
    OPEN cur1;  


    WHILE a = 0 DO  
        FETCH cur1 INTO b, c, d;

        SELECT fileId FROM lastUserAccess WHERE userId = b

        IF fileId IS NULL THEN
            INSERT INTO lastUserAccess (b, c, d);
        ELSE
            IF fileId = c THEN
                DELETE FROM table1 WHERE pkId = d;
            ELSE
                UPDATE lastUserAccess SET fileId = c WHERE userId = b;
            END IF;
        END IF;
    END WHILE;  

    CLOSE cur1;  
END

答案 1 :(得分:0)

对于mysql

DELETE a from  tbl a , tbl b WHERE a.Id>b.Id and
a.UserID = b.UserID and a.FileID= b.FileID;

检查这个小提琴http://sqlfiddle.com/#!2/aece0a/1

不适用于mysql,适用于sql server

DELETE FROM tbl WHERE ID NOT IN (SELECT MIN(ID) 
FROM tbl GROUP BY userID, fileID) 

希望这适合你。