обновить строки с повторяющимися записями

0

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

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

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
)

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

Вы не можете указать целевую таблицу "члены" для обновления в FROM раздел

Теги:
database
mysql-error-1093

2 ответа

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 Здорово! Ничего подобного крошечному обходному пути. Любопытно, если бы MySQL поддерживал что-то вроде: UPDATE M SET... FROM Members M WHERE... GROUP BY ... HAVING.... (MySQL здесь нет, ATM). Мысли?
  • 0
    @ p.campbell: я думаю, что вариант JOIN будет чище. Жаль, что JOIN в UPDATE & DELETE не поддерживается в большинстве других баз данных.
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню