2015-04-21 3 views
0

Im пытается сделать процедуру для обновления недавно выпущенного (недавно) пустого столбца.Как обновить сразу несколько строк в одном столбце?

В этом новом столбце я поместил значения результата, полученного с помощью запроса соединения. Чтобы объяснить это лучше, у меня есть этот

delimiter // 
create procedure update_amount_products (in id int) 
begin 
update categories set products_amount= 
      (SELECT DISTINCT COUNT(products_to_categories.products_id) 
FROM categories_description 
INNER JOIN products_to_categories ON products_to_categories.categories_id = categories_description.categories_id 
INNER JOIN products_description ON products_description.products_id = products_to_categories.products_id 
WHERE categories_description.categories_id =id) 
WHERE categories_id = id; 
end 
// 
call update_amount_products(id); 

Так что я хочу, это не вызов процедуры каждый раз с diferents «ид», я хочу, чтобы обновить все сразу (потому что есть более 1500 строк с diferents идентификаторы). Что я могу сделать?

Я думал о каком-то «за», чтобы получить все идентификаторы и сохранить их на переменной, которая позже использовалась в моей процедуре обновления, но я видел, что в sql нет возможности массива для каждого.

EDIT: Я хотел бы знать, если это как-то можно (Altho он сейчас не работает)

DELIMITER $$ 
CREATE PROCEDURE total_updated() 

    BEGIN 
     DECLARE a INT Default 1 ; 
     DECLARE category_length int; 

     select count(categories_id) into category_length from categories_description; 

     simple_loop: LOOP 
     SET a=a+1; 

     call update_amount_products(a); 

     IF a >= category_length THEN 
      LEAVE simple_loop; 
     END IF; 
    END LOOP simple_loop; 
END $$ 

Я не могу создать эту последнюю процедуру из-за каким-то глупое предупреждение о разделителе (иногда случается, даже когда я помещаю тот же самый код, который работал до этого)

У вас возникла ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «//» по строке 19

Любая помощь очень ценится.

ответ

0

Наконец-то я получил его, после нескольких попыток мне удалось получить то, что мне нужно, поэтому я поделюсь своим ответом.

Сначала я сделал одну процедуру, чтобы обновить одну единственную строку в колонке:

delimiter // 
create procedure update_amount_products (in id int) 
begin 
update categories set products_amount= 
      (SELECT DISTINCT COUNT(products_to_categories.products_id) 
FROM categories_description 
INNER JOIN products_to_categories ON products_to_categories.categories_id = categories_description.categories_id 
INNER JOIN products_description ON products_description.products_id = products_to_categories.products_id 
WHERE categories_description.categories_id =id) 
WHERE categories_id = id; 
end 
// 

DELIMITER ; 

Тогда я понял, что может обрабатывать весь столбец путем вызова процедуры с другой процедурой с петлей на нем

DELIMITER $$ 
CREATE PROCEDURE update_products_amount() 

    BEGIN 
     DECLARE a INT Default 1 ; 
     DECLARE category_length int; 

     select max(categories_id) into category_length from categories_description; 

     simple_loop: LOOP 
     SET a=a+1; 

     call update_amount_products(a); 

     IF a >= category_length THEN 
      LEAVE simple_loop; 
     END IF; 
    END LOOP simple_loop; 
END $$ 
DELIMITER ; 

commit; 

Наконец, все, что мне нужно сделать сейчас, это позвонить моей последней процедуре и voilá, вся моя колонка будет автоматически обновлена.

call update_products_amount(); 
0

В update заявления, вы можете обратиться к полю фактической записи обновляются. Поэтому в вашем случае вы можете ссылаться на categories_id в подзапросе, и вам не нужно указывать его как внешний параметр. Может быть, вы можете рассмотреть простое обновление, как это:

UPDATE categories c 
SET products_amount = 
    (SELECT DISTINCT COUNT(products_to_categories.products_id) 
    FROM categories_description 
    INNER JOIN products_to_categories 
     ON products_to_categories.categories_id = categories_description.categories_id 
    INNER JOIN products_description 
     ON products_description.products_id = products_to_categories.products_id 
    WHERE categories_description.categories_id = c.categories_id); 

Кроме того, присоединиться к products_description кажется ненужным, но это трудно сказать наверняка без схемы.

+0

Да, я заметил после некоторого исследования, что могу делать то, что вы здесь объясняете, но когда я попытался на самом деле, он отправил мне сообщение об ошибке с сообщением «Операнд должен содержать 1 столбец». В конце концов мне удалось получить то, что мне нужно (обновить весь столбец, используя 2 процедуры, и я покажу в своем ответе выше). Еще спасибо за ответ. Ps: the products_description я использую, чтобы присоединиться для получения имени (не помещался в сообщение, извините) – Nighthunter22

+0

Если у вас есть это сообщение об ошибке, вы попробовали sg совершенно иначе.Вы можете понять, почему mysql сообщает вам такую ​​ошибку [здесь] (https://dev.mysql.com/doc/refman/5.0/en/subquery-errors.html). Кроме того, если вы просто хотите считать product_ids, вам не нужно имя из описания продукта, поэтому вам не нужно входить в эту таблицу. –

+0

Объединения, которые мне нужны для внутренних целей, поэтому я оставляю это так. О сообщении об ошибке мне было все равно, так как это не помогло мне улучшить (по крайней мере, в тот момент). Так что пока я все хорошо. Спасибо за вашу заботу. – Nighthunter22

Смежные вопросы