Запрос в mysql с подзапросом

Рейтинг: -1Ответов: 2Опубликовано: 11.03.2023

Не работает. Где я ошибся?

"UPDATE asset
       SET asset_sum = asset_sum + $paymentIncome - $paymentExpense
       WHERE idasset = (SELECT idasset FROM asset ORDER BY idasset DESC LIMIT 1)");

update с вставленным вручную idasset работает. select отдельно тоже работает. Вместе не работает. Единственное, что приходит в голову, что и апдейт и селект из одной таблицы запрашиваются. что можно сделать?

Если упростить до такого , то работает

UPDATE asset 
SET asset_sum = asset_sum + '$paymentIncome' - '$paymentExpense' 
WHERE idasset = (59) 

Вот так уже не работает:

UPDATE asset 
SET asset_sum = asset_sum + '$paymentIncome' - '$paymentExpense' 
WHERE idasset = (SELECT idasset FROM asset WHERE idasset = 59)

Дело в подзапросе. Что не так?

Ответы

▲ 1Принят

У Вас должно быть сообщение типа You can't specify target table 'asset' for update in FROM clause. Это случай описан в документации (https://dev.mysql.com/doc/refman/8.0/en/update.html). Не разрешено делать селект из той же таблицы, что и обновляемая.
Предлагается использовать multiple-table update, например, так:

UPDATE asset,(SELECT idasset maxid FROM asset ORDER BY idasset DESC limit 1) as SelIds
SET asset_sum = asset_sum + (paymentIncome - paymentExpense)
WHERE idasset = SelIds.maxid;
▲ 0

А вы проверяли, подзапрос возвращает только одно значение, или может несколько? Если не одно, то UPDATE не может определить, какое значение использовать.

Как вариант:

UPDATE asset
SET asset_sum = asset_sum + $paymentIncome - $paymentExpense
WHERE idasset = (SELECT idasset FROM asset ORDER BY idasset DESC LIMIT 1)

Это будет последняя добавленная запись, если их несколько.