mysql,找到父节点

时间:2013-02-02 11:41:49

标签: php mysql hierarchical-data

我有一个标准的分层表ID / PID,如果某个子属于某个ID,我需要找到(布尔值)。有没有办法在mysql中执行此操作?

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

有没有办法知道子节点22是否属于节点1?我问,因为我想实现一些删除过程,其中节点1是我的回收。所有删除属于1将永久删除,所有其他删除将替换PID,因此暂时属于1。

非常感谢,

2 个答案:

答案 0 :(得分:1)

基于Hierarchical queries in 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
);

Test it.

答案 1 :(得分: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来避免。