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 ;

我现在觉得很蠢哈哈