#запрос #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).
Комментариев нет:
Отправить комментарий