MySQL存储过程循环

时间:2018-02-07 01:12:20

标签: mysql

所以我需要从2个不同的表中提取2个id字段并将它们插入到第三个表中。这是一个权限的事情,所以基本上我需要获取admin表的id和循环,直到所有building表的id填充到第三个表中building_user。这是开始"开始"权限表,所以我需要每个建筑物ID与每个管理员ID匹配。

这是我尝试的内容,我无法弄明白,但我知道我错过了什么。

CREATE PROCEDURE buildingUserAssignment()
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE done2 INT DEFAULT 0;
  DECLARE a, b INT;

   DECLARE admin CURSOR
   FOR
   SELECT id FROM admin;
   DECLARE building CURSOR
   FOR
   SELECT id FROM building;

   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;


  OPEN admin;
  OPEN building;
  REPEAT
    FETCH admin into a;

    REPEAT
    FETCH building into b;
    INSERT INTO building_user VALUES (a,b);
    UNTIL done END REPEAT;

  UNTIL done END REPEAT;


  CLOSE admin;
  CLOSE building;
END;

我最终只获得一个管理员ID字段(ID#2,即使ID为1)。以下是示例数据库:

admin

SELECT id FROM admin;
1
2
3
5
6
7
9
11

building

SELECT id FROM building;
0
1
3
6
7
8
10

调用buildingUserAssignment的当前最终结果:

SELECT * FROM building_user:
user_id building_id
2   0
2   1
2   2
2   3
2   4
2   4
3   4
5   4
6   4
7   4
9   4
11   4

所以building_user表最后应该是这样的,当然每个管理员ID都重复:

1 0
1 1
1 3
1 6
1 7
1 8
1 10

我确定它有些愚蠢,但我想我已经看了太长时间,现在我被卡住了。我甚至可能不会做这个"最好的"方式,所以我欢迎任何建议。

2 个答案:

答案 0 :(得分:2)

您不需要使用循环。有一种称为CROSS JOIN的连接,它根据第一个表中的行数乘以第二个表的行数生成结果集。结果行将插入INSERT INTO..SELECT语法。

INSERT INTO building_user 
SELECT a.id, b.id
FROM admin a CROSS JOIN building_user b

答案 1 :(得分:0)

WHILE i < v_count DO
    SET @start_date = JSON_UNQUOTE(JSON_EXTRACT(v_current_item, '$.start_date'));
    SET @expiry_date = JSON_UNQUOTE(JSON_EXTRACT(v_current_item, '$.expiry_date'));
    SET @amount = JSON_UNQUOTE(JSON_EXTRACT(v_current_item, '$.amount'));
    SET @emp_id = JSON_UNQUOTE(JSON_EXTRACT(v_current_item, '$.emp_id'));
    SET @update_id = JSON_UNQUOTE(JSON_EXTRACT(v_current_item,'$.update_id'));
                    SET i := i + 1;

 END WHILE;