Вы говорите, что пытались выполнить запрос, который не удался, но, к сожалению, вы не опубликовали его, поэтому я предполагаю, что он такой:
UPDATE car c
SET c.type = 1
WHERE c.owner_id IN ($ids)
AND c.status = (SELECT MAX(c2.status) FROM car c2 WHERE c.owner_id = c2.owner_id)
Было бы полезно опубликовать ваш фактический запрос, но сейчас я просто собираюсь предположить, что это то, что вы пытались. Если у вас есть что-то немного другое, это не имеет значения ... принцип тот же. Сбой, как вы правильно указали, потому что вы не можете обновить и выбрать одну и ту же таблицу в одном запросе. Один из способов обойти эту ошибку - заключить выбор в другой выбор:
UPDATE car c
SET c.type = 1
WHERE c.owner_id IN ($ids)
AND c.status = (SELECT * FROM
(SELECT MAX(c2.status) FROM car c2 WHERE c.owner_id = c2.owner_id)
AS T1)
Удивительно, но это сработает, даже если кажется, что оно должно быть эквивалентно первому запросу. Обратите внимание, что причина, по которой исходный запрос не работает, заключается в том, что он неправильно блокирует таблицу. Этот обходной путь заставляет MySQL разрешить запрос в любом случае, но вы должны знать, что его использование в многопользовательской среде может быть небезопасным.