обновить строки с повторяющимися записями - PullRequest
0 голосов
/ 18 сентября 2010

У меня такая же ситуация, как и этот другой вопрос , но я не хочу выбирать строки, я хочу обновить эти строки.

Я использовал решение Скотт Сондерс сделал :

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
)

, но я получаюэта ошибка:

Нельзя указать целевые таблицы 'members' для обновления в предложении FROM

Ответы [ 2 ]

6 голосов
/ 18 сентября 2010

Используйте промежуточный подзапрос, чтобы обойти ошибку 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 голосов
/ 18 сентября 2010

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

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

...