2010-09-18 5 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) 

В противном случае, используйте JOIN на производной таблице:

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

+1 Nice! Ничего похожего на крошечный обходной путь. Любопытно, что MySQL будет поддерживать что-то вроде: 'UPDATE M SET ... FROM Members M WHERE ... GROUP BY ... HAVING ....' (без MySQL здесь ATM). Мысли? –

+0

@ p.campbell: Я думаю, что JOIN будет чище. Слишком плохо, что JOIN в UPDATE & DELETE не поддерживается в большинстве других баз данных. –

0

Эта ошибка означает, что вы не можете обновить members таблицы на основе crite ria таблицы members. В вашем случае вы пытаетесь обновить таблицу members на основе подзапроса таблицы members. В процессе вы меняете эту таблицу. Подумайте об этом, как цыпленок перед парадоксом яйца.

Вам нужно будет создать временную справочную таблицу или сохранить/вставить диапазоны ip для запуска этого оператора обновления.

Смежные вопросы