0

我在一棵树中有几个元素(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()
4

2 回答 2

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 语句运行它。

于 2012-09-14T23:51:37.207 回答
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
于 2012-09-15T19:08:57.970 回答