Страницы

Поиск по вопросам

вторник, 17 марта 2020 г.

Сложный запрос UPDATE

#запрос #sql


Необходимо обновить ячейку таблицы в БД ситуация осложняется тем что в таблице к
одному id может быть несколько записей, а нужно лишь к одно из них.
Придумал такую штуку
UPDATE ".pref."iq_history  SET  hod='поле1'  WHERE ind=(SELECT MAX(ind) FROM tests_iq_history
WHERE user_id='id_ пользователя'

но она не работает, позже прочитал что UPDATE не работает с внутренним селектом по
той же таблице, советуют делать INNER JOIN, но я что то не могу покумекать как правильно
сделать запрос..    


Ответы

Ответ 1



У вас есть возможность добавить автоинкрементный PRIMARY KEY к вашей таблице tests_iq_history? Если да, то выборка бы упростилась Если нет, то может разбить на 2 запроса? maxId = SELECT MAX(ind) FROM tests_iq_history WHERE user_id='id_ пользователя'; UPDATE ".pref."iq_history SET hod='поле1' WHERE ind=maxId Но, честно говоря, использование MAX на большом объеме данных будет крайне медленно. Вероятно, лучше переписать так: maxId = SELECT ind FROM tests_iq_history WHERE user_id='id_ пользователя' ORDER BY ind DESC LIMIT 1; Но тут надо быть осторожным, т.к. может использоваться файловая сортировка, поэтому надо экспериментировать с PRIMARY KEY/UNIQUE по нескольким полям

Ответ 2



Можно сделать вложенный внутренний подзапрос. UPDATE `".pref."iq_history` SET `hod`='поле1' WHERE `ind`=(SELECT `ind` from (SELECT MAX(`ind`) FROM `tests_iq_history` WHERE `user_id`='?')x); или UPDATE `".pref."iq_history` SET `hod`='поле1' WHERE `ind`=(SELECT `ind` from (SELECT `ind` FROM `tests_iq_history` WHERE `user_id`='?' ORDER BY `ind` DESC LIMIT 1)x); Любопытно, что в разных версиях MySQL запросы выполняются по-разному. Поэтому стоит использовать EXPLAIN и при необходимости добавлять индексы. Для второго запроса, к примеру, (user_id, ind).

Комментариев нет:

Отправить комментарий