I've been using the crap out of the Nested Set Model lately. I have enjoyed designing queries for just about every useful operation and view. One thing I'm stuck on is how to select the immediate children (and only the children, not further descendants!) of a node.
To be honest, I do know of a way - but it involves unmanageable amounts of SQL. I'm sure there is a more straightforward solution.
Did you read the article you posted? It's under the heading "Find the Immediate Subordinates of a Node"
However, what I do (this is cheating) is I combined the nested set with adjacency lists -- I embed a "parent_id" in the table, so I can easily ask for the children of a node.
It seems to me this should be easily doable without the subqueries or parent column redundancy! For example, given parent's left and right are already known:
That is, “from all descendents of the node in question, pick ones with no ancestor between themselves and the node”.
THIS ONE IS BETTER AND SMALLER
User "bobince" almost had it. I figured it out and got it to work for me because I have a little more MySQL experience than most. However, I can see why bobince's answer might scare people off. His query is incomplete. You need to select the parent_left and parent_right into mysql variables first.
The two queries below assume that your table is named
tree
, your left column is namedlft
, right column is namedrgt
, and that your primary key is namedid
. Change these values to suit your needs. Also, examine the first select statement. You will see that I am looking up the immediate descendants of node 5. Change the number 5 to look for children of whatever node you want.I personally think this is a sleeker, sexier, and more efficient query than the others presented so far.
I found Wikipedia link has good minimized version of answer along with selected answer.
And, any of you try to express it with Linq, please follow the link: https://stackoverflow.com/a/25594386/361100
i know im doing a necro post, but here's my opinion.
why not include a "depth" column in your nested set? the depth column will indicate the "level" of an item.
so, to select the immediate childs of an item, just do
select c.*
from tree as p
join tree as c on (c.left > p.left and c.right < p.right and c.depth = p.dept + 1) where p.id = @parentID
I'd go with a depth column, too. But use
Wikipedia