2010-09-18 169 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范围才能运行该更新语句。