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