У меня такая же ситуация, как этот другой вопрос, но я не хочу выбирать строки, я хочу обновить эти строки.
Я использовал решение Скотт Сондерс:
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 раздел
Используйте промежуточный подзапрос, чтобы обойти ошибку 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'
Эта ошибка означает, что вы не можете обновить таблицу members
на основе критериев таблицы members
. В вашем случае вы пытаетесь обновить таблицу members
на основе подзапроса таблицы members
. В процессе вы меняете эту таблицу. Подумайте об этом, как цыпленок перед парадоксом яйца.
Вам нужно будет создать временную справочную таблицу или сохранить/вставить диапазоны ip для запуска этого оператора обновления.
UPDATE M SET... FROM Members M WHERE... GROUP BY ... HAVING....
(MySQL здесь нет, ATM). Мысли?