2011-05-23 106 views
1

我有一個數據庫,其中包含CMS驅動的網站的所有內容更新。我想創建一個查詢來清除所有舊的內容,但是留下每個頁面的最近幾(5)份副本(以防萬一)。該表包含一個TIMESTAMP字段和一個PAGE ID字段,以幫助我找到正確的行。 PrimaryKey是一個名爲RevisionId的字段。當然還有其他字段(例如包含頁面內容),但它們與此問題無關。基於時間戳的MySql中的嵌套刪除

我有這樣的查詢工作的罰款:

SELECT RevisionId 
    FROM `content` 
    WHERE PageId='55' 
ORDER BY Timestamp DESC LIMIT 5; 

它返回我要保存五個條目。

我以爲我可以窩這樣的:

DELETE 
    FROM `content` 
WHERE PageId='55' 
    AND RevisionId NOT IN ( 
      SELECT RevisionId 
      FROM `content` 
      WHERE PageId='55' 
     ORDER BY Timestamp DESC LIMIT 5); 

...但是,這給了我一個錯誤:

#1235 - 該版本的MySQL還不支持「LIMIT & IN/ALL/ANY/SOME子查詢」

我運行MySQL 5

問題的兩個部分:

  1. 我需要做些什麼來解決我到目前爲止的錯誤?
  2. 有沒有一種方法可以進一步自動執行此操作,以貫穿我的整個表格 ...不僅僅是PageId = '55' ,而是所有不同的PageId數字?

回答

0

目前MySQL不能處理刪除與子查詢到同一個表的語句。您需要創建臨時表以獲取最近行的列表,然後在子查詢中使用它。

+0

這是否意味着我必須跳出MySQL並使用PHP運行一系列命令來創建數據庫,然後執行刪除操作,然後刪除臨時數據庫?......這是我特別希望避免的。 – techtheatre 2011-05-23 06:31:23

+0

@techtheatre:是不是可以從PHP運行多語句MySQL查詢? – 2011-05-23 06:50:37

+0

這是...我只是希望我可以在一套嵌套查詢或其他東西中完成整個事情。看來,我將不得不在PHP中這樣做,這完全沒問題......我只是希望有一種更「原生」的方式來處理它。 – techtheatre 2011-05-23 07:51:44

0

這是一種野生的嘗試:

DELETE c FROM `content` AS c WHERE PageId='55' AND NOT EXISTS (SELECT 1 FROM `content` WHERE PageId='55' AND c.RevisionId = content.RevisionId ORDER BY content.Timestamp DESC LIMIT 5); 
+0

錯誤:#1093 - 無法在FROM子句中指定目標表'c'進行更新 – techtheatre 2011-05-23 06:30:03