2012-03-14 9 views
0

をwhitin:は、私は次の列を使用してデータベースを持っているカテゴリ

id, parent, name, description 

idオートincerementに設定されています。私は親カテゴリー(それは親が0に設定されています)にあるすべてのサブカテゴリーの合計数を取得したいと思います。これは再帰的でもありたいです。そうすることのいけにえの方法は何ができますか?

私はすでに次の関数を書いたが、私は現時点ではそれをテストすることはできません。

function CountDeepSubCategories($parentID, $max = 0) 
{ 
    global $_DB; 

    $all = $all + $max; 

    $q = $_DB->Query("SELECT id FROM category_cats WHERE parent = $parentID"); 
    $id = $_DB->GetResultValue($q, 0, 'id'); 

    $num = $_DB->GetResultNumber($q);  

    for($i = 0; $i < $num; $i++) 
    { 
     CountDeepSubCategories($id, $all); 
    } 

    return $all;   
} 
+1

を、しかし深いネスティング(3+レベル)すべてのテーブルを取得し、 'php'でツリーを構築する方が良いでしょう。 – kirilloid

+0

正確に何が必要ですか?質問テキストは情報(サブカテゴリ)を示していますが、再帰関数の戻り値を決して使用しないので、コードはあまり機能しませんが、コードは整数を示唆します。 – jeroen

+0

申し訳ありませんが、私は親カテゴリ(親の列が0である)に属しているサブとサブとサブクラスの数を知る必要があることを意味します。 –

答えて

1

すべてのカテゴリでは、親がありますか?

select cct.id, 
    (select count(1) from category_cats where parent=cct.id) as subcount 
from category_cats cct 

:あなたが投稿した第二のコメント、なぜあなたはちょうどこのようなインサイダークエリを追加していけないため、

OK :)「category_catsからのカウント(*)を選択」を行うことができる場合私はそれをテストしていないが、それは動作するはずです。

1

再帰は優雅な解決策のようですが、これは最高のパフォーマンスではありません。カテゴリツリーをNested Setとして保存することを検討することもできますが、これは新しいレコードを挿入するときにかなりのオーバーヘッドになりますが、ツリー全体を1つの単純なSQLクエリで取得する利点があります。

2

Bill Karwinのプレゼンテーション(http://www.slideshare.net/billkarwin/sql-antipatterns-strike-back)をご覧ください(問題は48ページで説明しています)。彼はあなたのソリューションの長所と短所を説明し、3つのソリューションを提供し、それらを互いに比較します。

+0

そのプレゼンテーションは実際に[SQL Antipatterns ](http://pragprog.com/book/bksqla/sql-antipatterns)本..それはちょっと必須IMHOです。 –

+0

私はBill Karwinと提携していませんが、その本はかなり目立ちました。あなたはSQLでより頻繁に仕事をするなら、非常に良いとあなたが持っている必要があると言ったように。 –

関連する問題