#1241 Operand should contain 1 column(s)

user

Здравствуйте. Подскажите, пожалуйста, как правильно сделать запрос? Делаю

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)

1 ответ

user

А почему не просто

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

licensed under cc by-sa 3.0 with attribution.