1

I have a standard hierarchical table ID/PID and I need to find (boolean) if some child belongs to some ID. Is there a way to do this within mysql?

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

Is there a way to know if child node 22 belongs to node 1 ? I'm asking because I want to implement some Delete procedure, where node 1 is my Recycle. All deletes belongs to 1 will be deleted permanently and all other delete will have PID replaced, so temporarily belongs now to 1.

Thanks very much in advance,

Sashi Kant
  • 13,277
  • 9
  • 44
  • 71
user1973900
  • 381
  • 4
  • 18

2 Answers2

1

Based on 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.

Community
  • 1
  • 1
dani herrera
  • 48,760
  • 8
  • 117
  • 177
  • Wow, this is absolutely excellent :) You give me homework to understand how it works! Thanks very much sir! – user1973900 Feb 02 '13 at 12:25
  • Remember that this is not a hight performance approach. They are other techniques to do it in real work environment: http://stackoverflow.com/questions/8961789/genealogy-tree-algorithm – dani herrera Feb 02 '13 at 13:16
0

Once again, thanks for this ellegant solution. I simplified a little since I don't need 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. There is a little drawback when use to get objects full path, result always returning last row NULL but this can be avoided with another SELECT.

user1973900
  • 381
  • 4
  • 18