2013-01-22 99 views
1

我知道mysql不允許在多個表刪除查詢中使用LIMIT。我在網上尋找解決方案,但我不知道如何使它們適應我的需要。以下是刪除不在內容中的所有內容的查詢,以便將表與其他條件一起保留。如何重寫DELETE查詢以便限制受影響的行?

DELETE f 
    FROM field_data_body f 
      INNER JOIN node n 
        ON f.entity_id = n.nid 
      LEFT JOIN content_to_keep k 
        ON n.nid = k.nid 
    WHERE n.type = 'article' 
      AND k.nid IS NULL 

那麼,我有什麼選擇添加一個LIMIT參數。

編輯: 感謝您的幫助,但大多數答案都使用where in條款。當我使用它,我得到一個錯誤說「該版本的MySQL還不支持「LIMIT & IN/ALL/ANY/SOME」子查詢「

+0

可能是一些與此類似:http://stackoverflow.com/q/1062988。你需要一個子查詢。 –

回答

2

在其選擇的行要被刪除的代碼的部分添加ORDER BYLIMIT,然後將其放置派生表內並加回到要刪除的表中:

DELETE f_del 
FROM field_data_body AS f_del 
    JOIN 
     (SELECT f.PK       --- the Primary Key of the table 
     FROM field_data_body f 
       INNER JOIN node n 
         ON f.entity_id = n.nid 
       LEFT JOIN content_to_keep k 
         ON n.nid = k.nid 
     WHERE n.type = 'article' 
       AND k.nid IS NULL 
     ORDER BY some_column 
     LIMIT 100 
    ) AS tmp 
     ON tmp.PK = f_del.PK ; 
+0

也做了這個,我得到這個版本的MySQL還不支持'LIMIT&IN/ALL/ANY/SOME子查詢' - – awm

+0

不支持LIMIT&IN的MySQL版本?這肯定是一個古老的版本,你真的應該升級。 – specializt

+0

@Ali:你是這樣運行的嗎?沒有任何改變?你使用的是什麼版本的MySQL?這裏既沒有「IN」也沒有「ALL」也沒有「ANY」。 –

0

也許讓你在正確的方向:

.... WHERE IN(SELECT ... FROM field_data_body WHERE NID IS NULL)

+0

這是標記爲'MySQL'。 MySQL中沒有「TOP」。 –

2
DELETE 
FROM field_data_body 
WHERE id in (
    SELECT f.id 
    FROM field_data_body f 
      INNER JOIN node n 
        ON f.entity_id = n.nid 
      LEFT JOIN content_to_keep k 
        ON n.nid = k.nid 
    WHERE n.type = 'article' 
      AND k.nid IS NULL) 
LIMIT 10; --or whatever you want 
+0

我做到了這一點,我得到這個版本的MySQL還不支持'LIMIT&IN/ALL/ANY/SOME子查詢' – awm

+0

@Ali:你一定會運行一些其他版本,而不是這個查詢。這不能給這樣的錯誤。 –

+0

運行它,是與ENTITY_ID更換ID返回follwoing錯誤'你不能指定目標表「field_data_body」的更新在FROM clause'下面是該查詢: 'DELETE FROM field_data_body WHERE ENTITY_ID在( ,選擇F .entity_id FROM field_data_body˚F INNER JOIN節點n ON f.entity_id = n.nid LEFT JOIN mbrd_delete_nodes_to_keepķ ON n.nid = k.nid WHERE n.type = '項目' AND k.nid IS NULL ) LIMIT 10;' – awm

0

From another question I was able to do the following

DELETE f 
FROM field_data_body f 
WHERE f.entity_id IN (SELECT * 
        FROM (SELECT f.entity_id 
          FROM field_data_body f 
            INNER JOIN node n 
              ON f.entity_id = n.nid 
            LEFT JOIN mbrd_delete_nodes_to_keep k 
             ON n.nid = k.nid 
          WHERE n.type = 'forum' 
            AND k.nid IS NULL 
            AND f.entity_type = 'node' 
          LIMIT 1) AS t) 
相關問題