2016-06-16 5 views
0

WHILEループを使用すると、特定の親のすべての子と子を見つけようとしていますが、希望の出力が得られません。驚いたことに、スクリプトを手動で実行すると、期待どおりに動作します。以下のスクリプトを見てください。WHILE挿入物が期待どおりに機能しないループ

DROP TABLE IF EXISTS test; 
CREATE TABLE test (id INT, parent_id INT); 
INSERT INTO test VALUES (1,NULL); 
INSERT INTO test VALUES (2,1); 
INSERT INTO test VALUES (3,2); 
INSERT INTO test VALUES (4,2); 
INSERT INTO test VALUES (5,3); 
INSERT INTO test VALUES (6,4); 
INSERT INTO test VALUES (7,2); 
INSERT INTO test VALUES (8,4); 
INSERT INTO test VALUES (9,1); 
INSERT INTO test VALUES (10,1); 
COMMIT; 

DELIMITER $$ 

USE `test`$$ 

DROP PROCEDURE IF EXISTS `get_parent_child_hierarchy`$$ 

CREATE PROCEDURE `get_parent_child_hierarchy`(Parent_ID INT) 
BEGIN 

DECLARE `rowcount` INT DEFAULT 1; 

DROP TABLE IF EXISTS Temp; 

CREATE TABLE Temp(ParentID INT, ChildID INT, Stage INT); 


INSERT INTO Temp(ParentID, ChildID, Stage) 
SELECT Parent_ID, Parent_ID, 2; 

WHILE rowcount > 0 DO 

    UPDATE Temp 
    SET Stage = 1 
    WHERE Stage = 2; 
    COMMIT; 

    INSERT INTO Temp(ParentID, ChildID, Stage) 
    SELECT Parent_ID, id, 2 
    FROM Test T 
    WHERE Parent_id IN (SELECT ChildID 
         FROM Temp 
         WHERE Stage = 1 
         AND Temp.ChildID <> T.id); 


    UPDATE Temp 
    SET Stage = 0 
    WHERE Stage = 1; 
    COMMIT; 

    SET rowcount = (SELECT COUNT(ChildID) 
        FROM Temp 
        WHERE Stage = 2); 

END WHILE; 


SELECT * 
FROM Temp 
WHERE Parent_ID <> ChildID; 

DROP TABLE IF EXISTS Temp; 

END$$ 

DELIMITER ; 

入力:2

予想される出力:

ParentID | ChildID | Stage 
---------|---------|------ 
    2 | 3 | 0 
    2 | 4 | 0 
    2 | 5 | 0 
    2 | 6 | 0 
    2 | 7 | 0 
    2 | 8 | 0 

しかしWHILEループを使用してスクリプトを実行すると、残念ながら、私は、入力内のすべての行を取得します。

何か助けていただければ幸いです。

私はこれが技術的な問題の問題よりもさらに問題であることに同意します。しかし、WHILEループとINSERTを使用するとMySQLに問題があるのだろうかと思います。

答えて

1

testの列である入力パラメータの名前をParent_IDと定義しました。これは、期待したものが得られなかった理由です。次

てみてください。)

CREATE PROCEDURE `get_parent_child_hierarchy`(pid INT) 
BEGIN 

DECLARE `rowcount` INT DEFAULT 1; 

DROP TABLE IF EXISTS Temp; 

CREATE TABLE Temp(ParentID INT, ChildID INT, Stage INT); 


INSERT INTO Temp(ParentID, ChildID, Stage) 
SELECT pid, pid, 2; 

WHILE rowcount > 0 DO 

    UPDATE Temp 
    SET Stage = 1 
    WHERE Stage = 2; 
    COMMIT; 

    INSERT INTO Temp(ParentID, ChildID, Stage) 
    SELECT pid, id, 2 
    FROM test T 
    WHERE parent_id IN (SELECT ChildID 
         FROM Temp 
         WHERE Stage = 1 
         AND Temp.ChildID <> T.id); 


    UPDATE Temp 
    SET Stage = 0 
    WHERE Stage = 1; 
    COMMIT; 

    SET rowcount = (SELECT COUNT(ChildID) 
        FROM Temp 
        WHERE Stage = 2); 

END WHILE; 


SELECT * 
FROM Temp 
WHERE pid <> ChildID; 

DROP TABLE IF EXISTS Temp; 

END 
+0

本当に働いていました。ありがとう@レノ –

関連する問題