Если вы пытаетесь обновить все записи в наборе, вы можете написать запрос следующим образом:
UPDATE message_queue mq
INNER JOIN (
SELECT NULL AS msg_id, NULL AS total, NULL AS found
FROM dual
WHERE (
@total :=0
OR
@found :=0
)
UNION
SELECT msg_id, @total AS total, @found :=1 AS found
FROM messages_queue
WHERE (
@total := @total + rcpts_count
)
AND @total <1000
UNION
SELECT msg_id, rcpts_count AS total, 0 AS found
FROM messages_queue
WHERE IF( @found =0, @found :=1, 0 )
) msgs ON msgs.msg_id = mq.msg_id
SET mq.fet_id = 12345;
Однако, в зависимости от вашей активности, это небезопасный подход, поскольку записи, возвращаемые по запросу, могут изменяться между двумя запросами.
Я бы порекомендовал один из следующих подходов:
- Обработка обновлений на стороне приложения
- Создать временную таблицу с результатом запроса и обновить таблицу путем объединения с временной таблицей
- Предполагая, что 'fet_id' является ключом, уникальным для этого пакета, сначала запустите оператор update, а затем выполните простой выбор на основе fet_id.