【问题标题】:MySQL foreach loopMySQL foreach 循环
【发布时间】:2018-08-20 17:57:01
【问题描述】:

我必须在 MySQL 中迭代我的表用户中的每一行。 我需要为 User 中的每次迭代创建一个新的行地址,其中一些条件如下所述。

我有 3 张桌子:

User: id, stuff, id_person, email
Person: id, stuff, id_address
Address: id, email

如果 User.id_person 不为 NULL 并且 person.id_address 为 NULL,我需要在 Address 中创建一个新行。 我必须使用与 User.email 相同的电子邮件创建行。 我必须对 User 中的每一行都这样做。

我尝试使用 MySQL 游标,但我不知道如何很好地使用它们。

我该怎么做?除了使用游标之外,还有其他方法吗?

提前致谢。

编辑:我刚刚意识到我还必须使用我刚刚创建的地址行的 id 更新 person.id_address。

【问题讨论】:

  • 查找 INSERT ,,, FROM SELECT。如果您可以构造一个 SELECT 语句,该语句会导致插入地址所需的“行”,那么就可以完成这项工作,而无需求助于 foreach 循环。
  • 你能贴出你试过的代码吗?这应该是一项相当容易的任务。如果我正确地分析了您的数据,我认为没有必要进行迭代,一个简单的INSERT INTO 带条件就足够了。

标签: mysql loops database-cursor


【解决方案1】:

据我所知,只要字段是您提供的,以下内容就足够了。

INSERT INTO Address (email)
  SELECT User.email
    FROM User JOIN person ON User.id_person = person.id
   WHERE person.id_address IS NULL
;

编辑(使用光标)

使用光标应该很简单,但我强烈建议您熟悉这些及其含义。

DROP PROCEDURE IF EXISTS _tmp_update_address;
DELIMITER $$
CREATE PROCEDURE _tmp_update_address()
BEGIN
   DECLARE cursor_List_isdone BOOLEAN DEFAULT FALSE;
   DECLARE cur_userId, cur_personId INT;
   DECLARE cur_email VARCHAR(250) DEFAULT '';

   DECLARE cursor_List CURSOR FOR 
      SELECT User.id, person.id_address, User.email
      FROM User JOIN person ON User.id_person = person.id
      WHERE person.id_address IS NULL
    ;

   DECLARE CONTINUE HANDLER FOR NOT FOUND SET cursor_List_isdone = TRUE;

   OPEN cursor_List;

   loop_List: LOOP
      FETCH cursor_List INTO cur_userId, cur_personId, cur_email;
      IF cursor_List_isdone THEN
         LEAVE loop_List;
      END IF;

      INSERT INTO Address (email) VALUES (cur_email);
      UPDATE person SET person.id_address = LAST_INSERT_ID()
         WHERE person.id = cur_personId;

   END LOOP loop_List;

   CLOSE cursor_List;
END

$$

DELIMITER ;

CALL _tmp_update_address();

【讨论】:

    【解决方案2】:

    您不想为此使用光标。根据您的描述:

    insert into address (address)
        select u.email
        from user u join
             person p
             on u.id_person = p.id;
    

    【讨论】:

      【解决方案3】:

      当我搜索“mysql foreach 循环”时,这就是我发现的,因为我找到了一个比光标更好的替代方法来执行 foreach 循环,我们在这里:

      delimiter $$
      create or replace procedure _tmp_procedure() begin
          for var_user in (
              select User.id, person.id_address, User.email
              from User join person on User.id_person = person.id
              where person.id_address is null
          ) do
              INSERT INTO Address (email) VALUES (var_user.email);
              UPDATE person SET person.id_address = LAST_INSERT_ID()
                  WHERE person.id = var_user.id_person;
          end for;
      end;
      $$
      
      call _tmp_procedure();
      

      【讨论】:

        猜你喜欢
        • 2016-10-25
        • 2014-12-05
        • 2015-10-29
        • 2016-09-02
        • 1970-01-01
        • 2016-12-28
        • 2017-10-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多