1

標準の階層テーブルID/PIDがあり、ある子があるIDに属しているかどうか(ブール値)を見つける必要があります。mysql内でこれを行う方法はありますか?

ID   PID
------------
1     0          <- root
...   ...
...   ... 
...   ...
7     1
...   ...
16    1
...   ...
4     0
...   ...
22    16
25    16

子ノード22がノード1に属しているかどうかを知る方法はありますか?ノード1がリサイクルであるDeleteプロシージャを実装したいので、質問しています。1に属するすべての削除は完全に削除され、他のすべての削除ではPIDが置き換えられるため、一時的に1に属します。

よろしくお願いします。

4

2 に答える 2

1

MySQLの階層クエリに基づく:

SET @x := 22;
SET @y := 0;

select 'yes' as x_comes_from_y 
from dual
where @y in
(
 SELECT  @id :=
        (
        SELECT  pid
        FROM    h
        WHERE   id = @id
        ) AS nodes
 FROM    (
        SELECT  @id := @x
        ) vars
 STRAIGHT_JOIN
        h
 WHERE   @id IS NOT NULL
);

試して。

于 2013-02-02T12:08:59.290 に答える
0

もう一度、このエレガントなソリューションに感謝します。STRAIGHT_JOINが必要ないので、少し簡略化しました

SET @x := 52;
SET @y := 41;

select 'yes' as x_comes_from_y 
from dual
where @y in
(
 SELECT  @id :=
        (
        SELECT  pid
        FROM    cat
        WHERE   id = @id
        ) 
 FROM    
        cat
 WHERE   @id IS NOT NULL
);

PS。オブジェクトのフルパスを取得するために使用する場合、少し欠点があります。結果は常に最後の行にNULLを返しますが、これは別のSELECTで回避できます。

于 2013-02-02T22:53:04.673 に答える