Нужен совет по MySQL и Php (как правильно составить запрос)?
Есть БД приблизительно на миллион записей у которой 4 поля: name, summ, original, original_already. Изначально первые три поля заполнены, нужно написать максимально оптимальный по времени/памяти запрос, который будет обновлять четвертое поле. Для каждой записи original_already должен равняться 1, если хотя бы в одной записи БД, у которой совпадают значения name и summ с текущей, значение original=1. В противном случае, в поле должен быть записан 0.
«Лобовое» решение (два вложенных цикла) не пройдет по времени. Хочется, чтобы запрос/скрипт работал не более часа и загружал не более 512M.
CREATE TEMPORARY TABLE tmp (
SELECT DISTINCT `name`, `summ` FROM `users` WHERE `original`=1
);
UPDATE `users` SET `original_already`=1 WHERE (`name`,`summ`) IN (SELECT `name`,`summ` FROM tmp)
Хочется понять, множно ли его улучшить по производительности.
BEGIN;
create temporary table TMP
as select name, summ
from THETABLE
where original = 1
group by name, summ;
update THETABLE set original_already = 0;
update THETABLE inner join TMP on TMP.name = THETABLE.name and TMP.summ = THETABLE.summ
set THETABLE.original_already = 1
drop table TMP;
COMMIT;
«Для каждой записи original_already должен равняться 1, если хотя бы в одной записи БД, у которой совпадают значения name и summ с текущей, значение original=1.» можно по-русски? ))
Общая задача такова. В БД хранится, куда (5 поле в БД, но оно тут не играт роли) человек (который характеризуется name и summ) подал документы, и подал ли он оригинал документа. Нужно, если он куда-нибудь его (оригинал) подал, во всех остальных записях (с такими же name и summ) записать, что оригинал он уже подал (поле original_already = 1). Надеюсь хоть как-то объяснил.