0

ツリー内にいくつかの要素があります(Jquery Nested Sortable)。このツリーには 2 つのタイプがあります。ノードを別のタイプの別のノードにドラッグすると、アイテムとその子を新しい親に更新したいと考えています。いくつかの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;

update ステートメントは魔法のように機能しますが、一度しか機能しません。変更 (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 に答える