I have two entities, post
and category
which is a 1:n
relationship.
I have a reference table with two columns, post_id
,category_id
The categories
table has an id
column, a status
column and a parent_id
column
If a category is a child of another category (n-depth) then it's parent_id
is not null.
If a category is online it's status is 1, otherwise it is 0.
What I need to do is find out if a post is visible.
This requires:
Foreach category joined to the post trace up it's tree to the root node (till a category has parent_id
== null
), if any of those categories have status
0 then that path is considered offline.
If any path is online then the post is considered visible, otherwise it is hidden.
The only way I can think of doing this (as semi-pseudo code) is:
function visible(category_ids){
categories = //select * from categories where id in(category_ids)
online = false
foreach(categories as category){
if(category.status == 0)
continue;
children = //select id from categories where parent_id = category.id
if(children)
online = visible(children)
}
return online
}
categories = //select c.id from categories c join posts_categories pc on pc.category_id = c.id where pc.post_id = post.id
post.online = visible(categories)
But that could end up being a lot of sql queries, is there a better way?
but hiding “closed” subtrees](http://stackoverflow.com/q/7729173/367456).
– hakre Oct 06 '12 at 10:20