我在树中有几个元素(Jquery Nested Sortable)。在这棵树中有两种可能的类型。当我将一个节点拖到另一个具有不同类型的节点时,我想将该项及其子项更新为其新父项。我得到它与一些PHP代码,但我不想执行很多sql更新。所以我决定让数据库做它的工作。
我正在尝试在sql中重复更新功能。但我无法让它发挥作用。我希望有人可以帮助我:
REPEAT
UPDATE elements a, elements b
SET a.type=b.type
WHERE a.parent_id=b.id
AND a.type<>b.type
AND a.parent_id<>0
UNTIL ROW_COUNT()=0
END REPEAT;
更新语句就像魅力一样,但只有一次。我希望查询一次又一次地运行,直到找不到任何更改(row_count)。
---更新: 对WojtusJ评论的反应 我在PhpMyAdmin的SQL窗口中尝试了以下内容:
DROP PROCEDURE IF EXISTS UpdateElements()
CREATE PROCEDURE UpdateElements();
BEGIN
DECLARE cnt;
REPEAT
SELECT count(*) AS cnt INTO @cnt
FROM elements AS a
JOIN elements AS b
ON (a.parent_id=b.id AND a.type<>b.type AND a.parent_id<>0);
UPDATE elements a, elements b
SET a.type=b.type
WHERE a.parent_id=b.id
AND a.type<>b.type
AND a.parent_id<>0;
UNTIL @cnt=0 END REPEAT;
END
CALL UpdateElements()
答案 0 :(得分:1)
如果我没弄错的话,这里使用ROW_COUNT()函数是错误的。您可能应该检查其他语句是否还有任何更改。试试这个:
DECLARE cnt INT;
REPEAT
SELECT count(*) AS cnt INTO @cnt
FROM elements AS a
JOIN elements AS b
ON (a.parent_id=b.id AND a.type<>b.type AND a.parent_id<>0);
UPDATE elements a, elements b
SET a.type=b.type
WHERE a.parent_id=b.id
AND a.type<>b.type
AND a.parent_id<>0;
UNTIL @cnt=0 END REPEAT;
编辑: 当然,您应该将上面的代码放在“CREATE PROCEDURE proc_name BEGIN ... END”中,然后使用CALL语句来运行它。
答案 1 :(得分:0)
感谢所有回复。我不知道如何创建例程。
在phpMyAdmin的SQL窗口中我做了以下(感谢WojtusJ)
DROP PROCEDURE IF EXISTS UpdateElements $$
CREATE PROCEDURE UpdateElements ()
BEGIN
DECLARE cnt INT;
REPEAT
SELECT count(*) AS cnt INTO @cnt
FROM elements AS a
JOIN elements AS b
ON (a.parent_id=b.id AND a.type<>b.type AND a.parent_id<>0);
UPDATE elements a, elements b
SET a.type=b.type
WHERE a.parent_id=b.id
AND a.type<>b.type
AND a.parent_id<>0;
UNTIL @cnt=0 END REPEAT;
END $$
将分隔符更改为$$(就在SQL窗口下方)
输入此例程后,可以在新的空白phpMyAdmin SQL窗口内(或在php脚本中)调用它
CALL UpdateElements