Mysql循环选择列并在循环中执行Insert查询

时间:2016-02-11 10:57:44

标签: mysql sql

我正在尝试遍历选定的slugs并执行一些复杂的INSERT INTO SELECT查询。 slugs[iteration]用法不是正确的mysql语法。但我必须在查询中逐个访问获取的slu。我怎么能实现这个目标?

DELIMITER $$
CREATE PROCEDURE create_sitemap_from_slugs()
BEGIN
    SELECT `slug`  INTO slugs FROM slug_table;
    SELECT COUNT(*)  INTO count FROM slug_table;

    SET iteration = 0;

    START TRANSACTION;

        WHILE iteration < count DO

            INSERT INTO line_combinations
                SELECT REPLACE(`line`, '{a}', slugs[iteration]) AS `line`
                FROM line_combinations
                WHERE `line` LIKE CONCAT('%/', '{a}', '%');

            SET iteration = iteration + 1;

        END WHILE;

    COMMIT;


END
$$
DELIMITER ;

顺便说一句,我不想​​使用任何外部编程语言来实现这一点,这个程序将用于数十亿行。由于性能问题,我读SQL中的循环不是一个好方法。

如果你建议另一种方式,我也会接受这个。

我问了另一个详细的问题,但无法得到答案。如果你想检查一下:https://stackoverflow.com/questions/35320494/fetch-placeholders-from-table-and-place-into-generated-line-combination-pattern

1 个答案:

答案 0 :(得分:1)

因此,对于包含{a}的每一行,您需要插入COUNT(*) from slug_table次填充slug值的值。

似乎你可以在SELECT

的一个INSERT中做到这一点
INSERT INTO line_combinations
            (SELECT REPLACE(lc.line, '{a}', st.slug) AS `line`
            FROM line_combinations lc, slug_table st
            WHERE lc.line LIKE CONCAT('%/', '{a}', '%');

更新:

您可以创建临时表line_combinations2并插入所有记录

FROM line_combinations 
WHERE line LIKE CONCAT('%/', '{a}', '%')

进入临时表。然后只使用INSERT中的临时表而不是原始的