SQL

Не отрабатывает вложенный MySQL запрос

Уменя есть запрос, который долго работает около минут обновляет 350000строк

1) UPDATE repotrs SET flow = '5000' WHERE temp IN ( '15', '20' );

Сама выборка работает быстро 3 сек
2) SELECT flow from reports WHERE temp IN ( '15', '20' );

Я решил сделать выборку, а потом ее обновить, чтобы быстрей работал запрос, но MySQL не дает обновить ту же самую таблицу, из которой происходит чтение пишет Error Code: 1093. You can't specify target table 'reports'
3) UPDATE reports SET flow='5000' WHERE (SELECT flow from reports WHERE temp IN ( '15', '20' ));

Сделал по другому, но теперь Error Code: 1242. Subquery returns more than 1 row

4) UPDATE reports SET flow = (SELECT flow FROM (SELECT flow FROM reports WHERE temp IN ( '15', '20' )) AS temp_table);

Вопрос в чем ошибка у меня и как правильно сформировать такой запрос?
Old School People
Old School People
518
Написано же английским языком подзапрос возращает более чем одну строку.
Вы пытаетесь однуому значению присвоить 2 значения.
Если и использовать подзапрос, то он должен возвращать одну строку
Люди советуют джоин использовать и на основе этого обновлять (https://stackoverflow.com/questions/13215832/update-multiple-rows-in-a-table-based-on-result-from-subquery)
А может вам легче тупо 2 запроса сделать и не морочить себе голову.
СТ
Сергей Тронев
28 652
Лучший ответ
Old School People Я вижу, что так написано, не пойму пока как перезаписать по другому.
2 запроса сначала выбрать, а потом обновить? а смысл не будет же обновляться только моя выборка
Old School People Так дурацко будет, лучше с JOIN попробую
Ошибка в том, что ты пытаешься присвоить КАЖДОЙ строке ВЕСЬ набор строк, возвращаемый подзапросом.

Самый быстрый способ обновить кучу строк - это пересоздать таблицу при помощи подходящего запроса. Во всех остальных случаях серверу надо будет тупенько перезаписать все твои изменения, и, возможно, пересчитать индексы - это займет время, никуда не денешься.
Юрий Демидов
Юрий Демидов
53 962
Old School People а как правильно записать?
Запрос UPDATE всегда будет работать медленнее SELECT. И ничего ты с этим не сделаешь: изменить содержимое файлов базы данных многократно дольше, чем просто их прочитать. И 350 тыс. строк ты в MySQL за 3 сек. никак не поменяешь.

Раз в твоём UPDATE есть WHERE, значит внутри себя СУБД сама делает SELECT - без твоего участия. И попытки вручную воткнуть SELECT в UPDАTE скорость работы UPDATE никак не увеличат. Так что не надо пытаться руками оптимизировать то, что внутренний оптимизатор СУБД и так постарался максимально ускорить.

Хочешь, чтобы работало быстро - меняй структуру данных: чтобы запросов на изменение большого кол-ва строк НЕ ТРЕБОВАЛОСЬ.
Old School People Последнее не вкурил, менять структуру данных это как? Я тут попробовал с JOIN сделать как советовали, то комп завис и пришлось с кнопки грузить
Old School People А если без радикальных вещей, мне сейчас нужно сделать правильный вложенный запрос
Old School People Этот запрос дольше выполняется, чем мой, индексы на столбцы я сделал, но у меня ощущение, что они не используются