3

referrals親子関係を含むテーブルで作業しています

ここに画像の説明を入力

親を取得する必要があります->子供->子供-> ....

上記のテーブルデータの場合、私の望ましい結果は

ここに画像の説明を入力

SOF からいくつかのコードを見たことがありますが、それらがどのように機能しているかを理解できず、頭の中で非常に簡単なロジックで自分自身を試してみましたが、残念ながら奇妙な理由で機能していません

そのためのストアド プロシージャを作成しましたが、問題で立ち往生しています。IN CLAUSE

DELIMITER $$

DROP PROCEDURE IF EXISTS `GetHierarchy3`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `GetHierarchy3`()
BEGIN
    DECLARE idss VARCHAR(225);
    SET @currentParentID := 999999;
    SET @lastRowCount := 0;

  ## A ##   
        INSERT INTO referrals_copy SELECT * FROM referrals WHERE uid1 = @currentParentID;

    SET @lastRowCount := ROW_COUNT();

 ## B ##
        SELECT GROUP_CONCAT(uid2)  INTO @idss FROM referrals WHERE  uid1 = @currentParentID;


    #SELECT @lastRowCount;
    SELECT * FROM referrals_copy;

    WHILE @lastRowCount > 0 DO
    SELECT "here";

        SELECT @idss;
  ## C ##
            INSERT INTO referrals_copy SELECT uid1, uid2 FROM referrals 
                WHERE uid1 IN (@idss);
            SET @lastRowCount := ROW_COUNT();
        #set @ids := NULL;
        SELECT @idss;
        SELECT GROUP_CONCAT(uid2) FROM referrals WHERE  uid1 IN (@idss);
        SELECT @idss;
        SET @lastRowCount := 0;

    END WHILE;


    -- return the final set now
    SELECT 
            *
        FROM referrals_copy;

END$$

CALL GetHierarchy3();

最初に、最初のクエリで必要なメインの親の子を取得し、A正常に動作します

次に、メインの親の子を変数@idssqueryに取得し、B正常に動作します

次に、ループでクエリの変数を使用しidssて子クエリを取得Cし、結果のテーブルに配置します...これは問題のある部分です

ここで、テーブルに値を挿入する必要が1111,2222ある変数にある最初の反復では、 ieの子のみを配置しますが、そうではありませんidss{3333, 4444} child of 1111, and {5555} child of 222211113333,44445555

C変数をクエリからチェックに置き換えようとしましたが、1111,2222' withinClaues`の値で問題なく動作しました

IN句がグループ連結からコンマ区切りの値を受け入れない理由、またはこのコードを修正するためのアイデア

よろしく

4

1 に答える 1

5

これを試してFIND_IN_SET(uid1,@idss)

このクエリ部分を置き換える必要があります

SELECT GROUP_CONCAT(uid2) FROM referrals WHERE uid1 IN (@idss);

これに

SELECT GROUP_CONCAT(uid2) FROM referrals WHERE FIND_IN_SET(uid1,@idss);

私はあなたのためにその仕事を願っています....

于 2012-06-11T11:03:02.247 に答える