MySql遍历多个具有相似名称的表

时间:2019-10-30 04:15:09

标签: mysql loops iterator

我想遍历几个具有类似名称的mysql表

table_1_user

table_2_user

table_3_user

总而言之,我希望迭代器最多计数20个,以便最终我将对所有20个表进行一些查询。如您所见,唯一的区别是名称中的数字。因此,我进行了一些研究,并发现answerMartynnw。 我不得不提到的一个缺点是缺少一个或两个ID,因此可能是我们有一个table_3和一个table_5,但table_4可能会丢失。因此,我还想检查一下该表是否存在(如有必要)。

我相信必须可以做这样的事情:

Declare @Id int

While @Id < 20
Begin

    UPDATE table_@Id_user SET option_value = 'mychange' WHERE my_id = 123;

End

但是我还不太清楚。

任何帮助将不胜感激!

非常感谢!

1 个答案:

答案 0 :(得分:0)

所以..几天后,我自己弄清楚了。

幸运的是,还有一个表包含我需要的所有ID,以便进行我正在寻找的更新。

除了

table_1_user
table_2_user
table_3_user

有一张桌子,上面摆着ID:

TABLE用户

user_id | user_name | ...
1         max
2         justin
...       ...

所以第一步,我必须创建一个临时表

CREATE TEMPORARY TABLE temp
SELECT user_id FROM users;

接下来,我必须创建一个过程才能使用while循环:

DELIMITER $$

DROP PROCEDURE IF EXISTS Update_User_URLS;
CREATE PROCEDURE Update_User_URLS()

BEGIN

...

END $$
DELIMITER ;

CALL Update_User_URLS();

然后,我必须在循环中从临时表中选择一个user_id时添加所需的 。在循环结束时,必须从临时表中删除此user_id:

DELIMITER $$

DROP PROCEDURE IF EXISTS Update_User_URLS;
CREATE PROCEDURE Update_User_URLS()

BEGIN

    WHILE (SELECT COUNT(*) FROM temp) > 0 DO

        SELECT @id := user_id FROM temp LIMIT 1;

            ...

        DELETE FROM temp WHERE user_id = @id;

    END WHILE;

END $$
DELIMITER ;

CALL Update_User_URLS();

在while循环中,我不得不将变量设置为连接表名,并使用 PREPARE 来指定查询以及执行以将其触发。

DELIMITER $$

DROP PROCEDURE IF EXISTS Update_User_URLS;
CREATE PROCEDURE Update_User_URLS()

BEGIN

    WHILE (SELECT COUNT(*) FROM temp) > 0 DO

        SELECT @id := user_id FROM temp LIMIT 1;

            SET @table = concat('table_', @id, '_user');
            SET @query = concat('UPDATE ', @table, 'SET user_url = replace(user_url, '"example.com"', '"anotherexample.com"')')

            PREPARE statement from @query;
            EXECUTE statement;

        DELETE FROM temp WHERE user_id = @id;

    END WHILE;

END $$
DELIMITER ;

CALL Update_User_URLS();

对我有用!