Select 使用存储过程在商店捆绑系统中逐行(重复直到一定数量)
Select multiple rows with (repeat until certain amount) one by one in shop bundling system using stored procedure
所以我是 MySQL 的新手,我正在制作一个系统,用于为我的大学游戏项目捆绑购买游戏内物品。
到目前为止我有一个商店table用于显示游戏内商店中可用的物品
CREATE TABLE t_shop(
shop_id INT PRIMARY KEY AUTO_INCREMENT,
item_type_id INT,
item_id INT,
amount INT,
price INT,
);
(捆绑商品在 item_type_id、item_id 和金额中具有空值,稍后将在我的购买商品程序中用作捆绑商品的标记)
和一个捆绑包 table,其中包含该捆绑包中包含的物品的详细信息(使用 shop_id 作为外键,指向它在商店中属于哪个捆绑包 table )
CREATE TABLE t_special_box(
shop_id INT,
item_type_id INT,
item_id INT,
amount INT,
CONSTRAINT FK_t_special_box_shop_id
FOREIGN KEY (shop_id) REFERENCES
t_shop(shop_id)
ON UPDATE CASCADE ON DELETE CASCADE,
);
在我的存储过程中,我想在检测到 shop_id 时将“t_special_box”table 中的项目插入到我的每个库存 table 中作为一个包 table(item_type_id 将用于确定“该项目属于哪个库存”以插入存储过程)
到目前为止,这就是我得到的
DELIMITER $$
CREATE PROCEDURE p_special_box_calculate(in v_player_id INT, in v_shop_id INT)
READS SQL DATA
SQL SECURITY DEFINER
this_proc: BEGIN
DECLARE counter INT DEFAULT 0;
SELECT COUNT(shop_id)
INTO @counter
FROM t_special_box
WHERE shop_id = v_shop_id;
REPEAT
SELECT item_type_id, item_id, amount
INTO @item_type_id, @item_id, @amount
FROM t_special_box
WHERE shop_id = v_shop_id
LIMIT 1;
CALL p_item_insert(v_player_id, @item_type_id, @item_id, @amount);
SET counter = counter + 1;
UNTIL counter = @counter
END REPEAT;
END $$
DELIMITER ;
说在我的t_special_boxtable有:
shop_id, item_type_id, item_id, amount:
(10, 2, 3, 30)
(10, 1, 3, 2)
“p_special_box_calculate”程序的问题是,它只能读取第一行,即 (10, 2, 3, 30),并且它插入了两次而忽略了其余行.
我希望我的程序逐行读取两行,然后它可以 运行 每个选定行的“p_item_insert”程序(具有相同的 shop_id当然),然后每个被选择的数据将被插入到每个库存 tables 它被分配到
PS:我试图以我有限的知识提供尽可能多的信息,所以如果您需要更多详细信息,请随时询问或纠正我:)
我终于找到了解决方案。
原来只是在repeat语句中的LIMIT 1
前加上OFFSET counter
一样简单,所以它可以select下一行根据我之前声明的计数器(which每次加一,直到达到要求的数量)
所以这是最终的解决方案:
DROP PROCEDURE IF EXISTS p_special_box_calculate;
DELIMITER $$
CREATE PROCEDURE p_special_box_calculate(in v_player_id INT, in v_shop_id INT, out result INT)
READS SQL DATA
SQL SECURITY DEFINER
this_proc: BEGIN
DECLARE counter INT DEFAULT 0;
SELECT COUNT(shop_id)
INTO @counter
FROM t_special_box_detail
WHERE shop_id = v_shop_id;
REPEAT
SELECT item_type_id, item_id, amount
INTO @item_type_id, @item_id, @amount
FROM t_special_box_detail
WHERE shop_id = v_shop_id
LIMIT 1 OFFSET counter;
CALL p_inventory_item_insert(v_player_id, @item_type_id, @item_id, @amount, @result);
SET counter = counter + 1;
UNTIL counter = @counter
END REPEAT;
SET result = 1;
END $$
DELIMITER ;
我现在觉得很蠢哈哈
所以我是 MySQL 的新手,我正在制作一个系统,用于为我的大学游戏项目捆绑购买游戏内物品。
到目前为止我有一个商店table用于显示游戏内商店中可用的物品
CREATE TABLE t_shop(
shop_id INT PRIMARY KEY AUTO_INCREMENT,
item_type_id INT,
item_id INT,
amount INT,
price INT,
);
(捆绑商品在 item_type_id、item_id 和金额中具有空值,稍后将在我的购买商品程序中用作捆绑商品的标记)
和一个捆绑包 table,其中包含该捆绑包中包含的物品的详细信息(使用 shop_id 作为外键,指向它在商店中属于哪个捆绑包 table )
CREATE TABLE t_special_box(
shop_id INT,
item_type_id INT,
item_id INT,
amount INT,
CONSTRAINT FK_t_special_box_shop_id
FOREIGN KEY (shop_id) REFERENCES
t_shop(shop_id)
ON UPDATE CASCADE ON DELETE CASCADE,
);
在我的存储过程中,我想在检测到 shop_id 时将“t_special_box”table 中的项目插入到我的每个库存 table 中作为一个包 table(item_type_id 将用于确定“该项目属于哪个库存”以插入存储过程)
到目前为止,这就是我得到的
DELIMITER $$
CREATE PROCEDURE p_special_box_calculate(in v_player_id INT, in v_shop_id INT)
READS SQL DATA
SQL SECURITY DEFINER
this_proc: BEGIN
DECLARE counter INT DEFAULT 0;
SELECT COUNT(shop_id)
INTO @counter
FROM t_special_box
WHERE shop_id = v_shop_id;
REPEAT
SELECT item_type_id, item_id, amount
INTO @item_type_id, @item_id, @amount
FROM t_special_box
WHERE shop_id = v_shop_id
LIMIT 1;
CALL p_item_insert(v_player_id, @item_type_id, @item_id, @amount);
SET counter = counter + 1;
UNTIL counter = @counter
END REPEAT;
END $$
DELIMITER ;
说在我的t_special_boxtable有:
shop_id, item_type_id, item_id, amount:
(10, 2, 3, 30)
(10, 1, 3, 2)
“p_special_box_calculate”程序的问题是,它只能读取第一行,即 (10, 2, 3, 30),并且它插入了两次而忽略了其余行.
我希望我的程序逐行读取两行,然后它可以 运行 每个选定行的“p_item_insert”程序(具有相同的 shop_id当然),然后每个被选择的数据将被插入到每个库存 tables 它被分配到
PS:我试图以我有限的知识提供尽可能多的信息,所以如果您需要更多详细信息,请随时询问或纠正我:)
我终于找到了解决方案。
原来只是在repeat语句中的LIMIT 1
前加上OFFSET counter
一样简单,所以它可以select下一行根据我之前声明的计数器(which每次加一,直到达到要求的数量)
所以这是最终的解决方案:
DROP PROCEDURE IF EXISTS p_special_box_calculate;
DELIMITER $$
CREATE PROCEDURE p_special_box_calculate(in v_player_id INT, in v_shop_id INT, out result INT)
READS SQL DATA
SQL SECURITY DEFINER
this_proc: BEGIN
DECLARE counter INT DEFAULT 0;
SELECT COUNT(shop_id)
INTO @counter
FROM t_special_box_detail
WHERE shop_id = v_shop_id;
REPEAT
SELECT item_type_id, item_id, amount
INTO @item_type_id, @item_id, @amount
FROM t_special_box_detail
WHERE shop_id = v_shop_id
LIMIT 1 OFFSET counter;
CALL p_inventory_item_insert(v_player_id, @item_type_id, @item_id, @amount, @result);
SET counter = counter + 1;
UNTIL counter = @counter
END REPEAT;
SET result = 1;
END $$
DELIMITER ;
我现在觉得很蠢哈哈