我正在尝试执行一个程序来更新最近添加的(现在)空列。
在这个新专栏中,我将把连接查询获得的结果的值。 为了更好地解释它,我有这个
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);
所以我想要的是,不是每次都使用不同的“ids”调用该过程,我想一次更新所有(因为有超过1500行有差异ID)。我该怎么办?
我一直在考虑某种“for”来获取所有id并将它们保存在一个变量中,以后在我的更新过程中使用,但我已经看到sql中没有任何数组可能性也没有foreach 。
修改 我想知道这是否有可能(现在它不起作用)
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 :(得分: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;
最后,我现在要做的就是打电话给我的最后一个程序,我的所有栏目都会自动更新。
call update_products_amount();
答案 1 :(得分: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
的联接似乎是不必要的,但如果没有架构,很难说它是肯定的。