我正在尝试遍历选定的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
答案 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中的临时表而不是原始的