1

我有一个标准的分层表 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。

首先十分感谢,

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 回答