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

SQLサーバーの場合、mysqlでは機能しません

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

これがうまくいくことを願っています。

于 2013-02-01T03:47:06.407 に答える