我正在尝试创建一个存储过程,除其他外,用其他表中的信息更新表:
UPDATE table1 T1, table2 T2
set T1.rank = T1.rank + T2.rank
T1.tags = merge(T1.tags, T2.tags)
WHERE T1.id = T2.id
tags是一串逗号分隔的单词,merge是一个函数(不是一个过程),它将字符串分解为临时表,并使用预准备语句返回带有唯一标记的新字符串。我知道不能在函数内部使用预处理语句,但使用它们的部分是在函数内部调用的过程中。
所以我得到一个错误,我不能在函数内使用动态sql过程 我需要这个函数,所以我可以使用返回值作为更新中的新值。
任何可能的方法来实现这个目标吗?
答案 0 :(得分:0)
您可以使用纯SQL在一个语句中执行此操作(使用合并标记进行更新)。诀窍在于使用一个数字名称计数表,可以在几秒钟内创建和填充(也可以使用一个SQL语句)。
这是您的UPDATE
声明
UPDATE table1 t1 JOIN table2 t2
ON t1.id = t2.id JOIN
(
SELECT id, GROUP_CONCAT(DISTINCT tag ORDER BY tag) tags
FROM
(
SELECT a.id, SUBSTRING_INDEX(SUBSTRING_INDEX(tags, ',', n.id), ',', -1) tag
FROM
(
SELECT t1.id, CONCAT(t1.tags, ',', t2.tags) tags
FROM table1 t1 JOIN table2 t2
ON t1.id = t2.id
) a CROSS JOIN tally n
WHERE n.id <= 1 + (LENGTH(tags) - LENGTH(REPLACE(tags, ',', '')))
AND n.id < 100 -- change that number to accommodate max possible number of tags
) b
GROUP BY id
) c ON t1.id = c.id
SET t1.tags = c.tags,
t1.rank = t1.rank + t2.rank
这是一个模式和语句,用于填充最多100k行的计数表。
CREATE TABLE tally (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
INSERT INTO tally
SELECT NULL
FROM (SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
, (SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
, (SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) c
, (SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) d
, (SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) e
;
这是 SQLFiddle 演示