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,

4
  • You should take a look at stackoverflow.com/a/3276806/477878, this is not entirely straight forward using MySQL. Commented Feb 2, 2013 at 11:46
  • By convention, NULL is normally used for root nodes. Commented Feb 2, 2013 at 11:56
  • if you want to do this with a single query, use the nested set model Commented Feb 2, 2013 at 12:00
  • I think NULL better reflects the idea that not only is a root's parent unknown but also it may not necessarily be shared with another root. BTW, in this instance, I would definitely look at nested sets. Commented Feb 2, 2013 at 12:00

2 Answers 2

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.

Sign up to request clarification or add additional context in comments.

2 Comments

Wow, this is absolutely excellent :) You give me homework to understand how it works! Thanks very much sir!
Remember that this is not a hight performance approach. They are other techniques to do it in real work environment: stackoverflow.com/questions/8961789/genealogy-tree-algorithm
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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.