まず、カテゴリを取得するには...
カテゴリのネストの深さが 2 レベル (親と子) のみである場合、または直接のサブカテゴリのみに関心がある (つまり、サブカテゴリのサブカテゴリではない) 場合、SQL は非常に単純です。
SELECT cat_id FROM category_table WHERE cat_id = $catid OR parent_id = $catid
ネストがより深い場合は、カテゴリのネストまで再帰的にクエリを実行する必要があります。たとえば、自分自身を 3 レベルに制限する場合、次のように SQL でこれを行うことができます。
SELECT cat_id FROM category_table ct1
WHERE cat_id = $catid OR parent_id = $catid
OR parent_id in (SELECT cat_id FROM category_table WHERE parent_id = ct1.cat_id)
同様に、4 レベルの深いネストの場合、SQL をさらに複雑にすることができます。
SELECT cat_id FROM category_table ct1
WHERE cat_id = $catid OR parent_id = $catid
OR parent_id in (SELECT cat_id FROM category_table ct2 WHERE parent_id = ct1.cat_id
OR parent_id in
(SELECT cat_id FROM category_table ct3 WHERE parent_id = ct2.cat_id))
等々。
入れ子の深さが固定されていない場合は、コードでループを実行する必要があります。
すべてのカテゴリを取得したら、記事をクエリします。したがって、単純な 2 レベルの依存関係の場合、次のようになります。
SELECT * FROM article_table
WHERE cat_id in (SELECT cat_id FROM category_table WHERE cat_id = $catid OR parent_id = $catid)
同様に、3 レベルのネスティングの場合、次のようになります。
SELECT * FROM article_table
WHERE cat_id in
(SELECT cat_id FROM category_table ct1
WHERE cat_id = $catid OR parent_id = $catid
OR parent_id in (SELECT cat_id FROM category_table WHERE parent_id = ct1.cat_id))
等々...