Здравствуйте. Подскажите, пожалуйста, как правильно сделать запрос? Делаю
update catalog
set catalog.id_cat = case when catalog.id_cat_1s = ""
then "0" else (select id, idp_1c from catalog as t1 where
t1.idp_1c = catalog.id_cat_1s) end
where catalog.id >= 1 and catalog.id < 500;
и вываливается ошибка #1241 Operand should contain 1 column(s)
Если делаю вот такой запрос
UPDATE catalog
left JOIN catalog AS table1
ON catalog.id_cat_1s = table1.idp_1c
COLLATE utf8_unicode_ci
SET catalog.id_cat = case when catalog.id_cat_1s = ""
then "0" else table1.id end
where catalog.id >= 1 and catalog.id < 500;
то все отрабатывает нормально. Возможно ли сделать такое без join'ов, т.к. с join'ом запрос обрабатывает где-то 10 000 строк и делает это 15 минут, уж как-то долго? Или может подскажете другой метод, чтоб делать это быстрее?
UPD: решение:
update catalog
set catalog.id_cat = case when catalog.id_cat_1s = "" then "0"
else (select id from
(select id, idp_1c from catalog) as t1
where t1.idp_1c = catalog.id_cat_1s)
end;
В итоге выполнение запроса с 15 минут снизилось до 658мс. (10175 rows affected in 658ms)
А почему не просто
UPDATE catalog AS t0
LEFT JOIN (SELECT id, idp_1c FROM catalog) AS t1 ON t1.idp_1c = t0.id_cat_1s
SET t0.id_cat = COALESCE(t1.id,0)
?
UPD: И правда, зачем нам подзапрос?
UPDATE catalog AS t0
LEFT JOIN catalog t1 ON t1.idp_1c = t0.id_cat_1s
SET t0.id_cat = COALESCE(t1.id,0)
Само собой желательно наличие индексов по idp_1c (ещё лучше, наверное - по (idp_1c,id)) и id_cat_1s
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости