0

我有一个表,其中有一些重复的文件访问信息,其中重复的文件访问定义为同一用户背靠背访问同一文件。换句话说,如果用户按该顺序访问文件 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

4

2 回答 2

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
于 2013-02-01T03:43:27.950 回答
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) 

希望这对你有用。

于 2013-02-01T03:47:06.407 回答