MySQL не нравится, когда вы пытаетесь ОБНОВИТЬ и ВЫБРАТЬ из одной таблицы в одном запросе. Это связано с приоритетами блокировки и т. Д.
Вот как бы я решил эту проблему:
SELECT CONCAT('UPDATE response SET status = 3 ',
'WHERE status = 1 AND title = ', QUOTE(title), ';') AS sql
FROM response
GROUP BY title
HAVING COUNT(*) >= 20;
Этот запрос создает серию операторов UPDATE с заголовками в кавычках, которые заслуживают обновления. Захватите результат и запустите его как скрипт SQL.
Я понимаю, что GROUP BY
в MySQL часто использует временную таблицу, и это может быть дорогостоящим. Но является ли это нарушителем соглашения? Как часто вам нужно выполнить этот запрос? Кроме того, любые другие решения также могут потребовать временную таблицу.
Я могу придумать, как решить эту проблему, не используя GROUP BY
:
CREATE TEMPORARY TABLE titlecount (c INTEGER, title VARCHAR(100) PRIMARY KEY);
INSERT INTO titlecount (c, title)
SELECT 1, title FROM response
ON DUPLICATE KEY UPDATE c = c+1;
UPDATE response JOIN titlecount USING (title)
SET response.status = 3
WHERE response.status = 1 AND titlecount.c >= 20;
Но здесь также используется временная таблица, поэтому вы стараетесь не использовать GROUP BY
.