REPEAT UPDATE SQL语句

时间:2012-09-14 22:20:38

标签: mysql sql-update inner-join repeat

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

2 个答案:

答案 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