2010-09-18 171 views
0

我與this other question的情況相同,但我不想選擇行,我想更新這些行。更新重複條目的行

我用solution Scott Saunders made

select * from table where email in (
    select email from table group by email having count(*) > 1 
) 

這工作,但我想改變/更新這些條目行的值,所以我嘗試:

UPDATE `members` SET `banned` = "1" WHERE `ip` IN (
    SELECT `ip` FROM `members` GROUP BY `ip` HAVING COUNT(*) > 1 
) 

,但我得到這個錯誤:

You can't specify target table 'members' for update in FROM clause

回答

6

使用一箇中間的子查詢得到解決1093錯誤:

UPDATE `members` 
    SET `banned` = '1' 
WHERE `ip` IN (SELECT x.ip 
        FROM (SELECT `ip` 
          FROM `members` 
         GROUP BY `ip` 
         HAVING COUNT(*) > 1) x) 

否則,請使用派生表的連接:

UPDATE MEMBERS 
    JOIN (SELECT `ip` 
      FROM `members` 
     GROUP BY `ip` 
     HAVING COUNT(*) > 1) x ON x.ip = MEMBERS.ip 
    SET banned = '1' 
+0

+1不錯!沒有什麼像一個小小的解決方法。好奇,如果MySQL會支持這樣的事情:'更新M設置...從成員M在哪裏...... GROUP BY ...有......'(沒有MySQL在這裏ATM)。思考? – 2010-09-18 18:38:55

+0

@ p.campbell:我認爲JOIN選項會更乾淨。太糟糕了,在大多數其他數據庫中不支持UPDATE和DELETE中的JOIN。 – 2010-09-18 18:41:16

0

此錯誤表示您無法更新基於標準的membersmembers表的ria。在你的情況下,你試圖根據members表的子查詢來更新members表。在這個過程中,你正在改變這張桌子。在雞蛋悖論之前把它想象成一隻雞。

您需要製作臨時參考表或保存/粘貼IP範圍才能運行該更新語句。