私には2つのエンティティがpost
あり、category
どちらが1:n
関係です。
2つの列を持つ参照テーブルがありますpost_id
。category_id
categories
テーブルには、id
列、status
列、および列がありparent_id
ます
カテゴリが別のカテゴリ(n-depth)の子である場合、それparent_id
はnullではありません。
カテゴリがオンラインの場合、ステータスは1です。それ以外の場合は、0です。
私がする必要があるのは、投稿が表示されているかどうかを確認することです。
これには以下が必要です。
投稿に参加したForeachカテゴリは、ルートノードまでのツリーをトレースします(カテゴリがparent_id
==になるまでnull
)。これらのカテゴリのいずれかがstatus
0の場合、そのパスはオフラインと見なされます。
いずれかのパスがオンラインの場合、投稿は表示されていると見なされ、そうでない場合は非表示になります。
これを(半擬似コードとして)行うことを考えることができる唯一の方法は次のとおりです。
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)
しかし、それは多くのSQLクエリになる可能性がありますが、より良い方法はありますか?