2013-02-01 28 views
0

我有一個表,其中有一些重複的文件訪問信息,其中重複的文件訪問被定義爲背靠背訪問同一文件的同一用戶。換句話說,如果用戶按順序訪問文件A,B,A,則不認爲它是重複的。所以基本上,每個用戶我想確保每個後續訪問都是針對與上一個不同的文件。MySQL刪除背靠背重複

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(主鍵),用戶ID,FILEID,accessTime

+1

我認爲你需要重新評估你的設計,這樣你就不需要做這種類型的練習。 – Kermit

+0

你在這張桌子上有主鍵嗎? – Sam

+2

除非此表上有時間戳列,否則您運氣不好。 SQL中的表沒有隱式順序,沒有唯一的排序鍵,引擎可以按任意順序自由返回行。 –

回答

0

如果你犯了一個存儲過程會是這個樣子。您可能需要另一個臨時表和循環,因爲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 
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) 

希望這對你的作品。

+0

這隻會保持用戶首次訪問文件。如果用戶訪問第二個文件然後再次訪問第一個文件,我們不希望將第三個訪問計爲重複,因爲中間存在不同的文件。 – Nefsu