2011-06-28 9 views
1

セクションのサブセクションをデータベースから再帰的に取得しようとしています。今のところ、私のコードは親を取得しますが、子は取得しません。目標を達成するためにこのコードにどのような変更を加える必要がありますか?代わりに、複数のクエリを実行する -PHPは再帰的にすべてのセクションを取得します

function getSections() 
{ 
    $this->connectToDB(); 

    // get list of sections that has no parents 
    $sql ="SELECT * FROM sections WHERE parent = 0 ORDER BY id ASC"; 
    $result = mysql_query($sql); 
    while($row=mysql_fetch_array($result)) 
    { 
     $thisID = $row['id']; 

     // recursivly get childeren 
     $childeren = $this->recursivlyGetSections($thisID); 

     // add to the final result 
     $toReturn .= "$thisID<br>$childeren"; 
    } 

    // return final result 
    return $toReturn; 
} 
+2

複数のクエリを実行するのではなく、['JOIN'](http://dev.mysql.com/doc/refman/5.0/ja/join.html)の実行を検討しましたか? – Sampson

+0

@Jonathan Sampson♦:最大深さを制限しませんか? – Piskvor

+0

完全に参加することはここでの方法ですが、右の参加を実行することを確認してください:) good call Jonathan – Deviland

答えて

4
function getSections() 
{ 
    $this->connectToDB(); 

    // get list of sections 
    $sql ="SELECT * FROM sections ORDER BY id ASC, parent ASC"; 
    $result = mysql_query($sql); 
    $rezArray = array(); 
    while($row=mysql_fetch_array($result)) 
    { 
     if(!isset($rezArray[$row['parent']])) 
       $rezArray[$row['parent']] = array(); 
     $rezArray[$row['parent']][] = $row; 
    } 

    //.. do something with the array 
} 

使用$rezArrayありがとう親によってソートされたすべての結果を有しています。

+0

これは、自分の作品のイントラネットサイト用に作成したスレッドボード用のものです。無制限のネストスレッドが可能で使いやすい。 –

+0

IDは何ですか?これはうまくいくと思いますか? :) –

+0

+1それは自然なアプローチです。しかし、私は参照を使用します( '... =&$ row'のように)。 – Tomalak

2

あなたは、データベース内の完全なツリー構造を保存したいしていて、それはより頻繁にそれが書かれていることから読み込んだ場合、ネストされたセットとしてストレージの実装を検討することをお勧めします:

http://en.wikipedia.org/wiki/Nested_set_model

+1

木のためのいつもの良いコメント..しかし、私は簡単な木の検索コードを書くこともできないので、この*実用的な答えを呼ぶことはありません。 –

+0

@yi_H:まあ、どこかで始める*、いいえ?とにかく、回答はOPの利益のためだけではなく、私からの+1です。 – Piskvor

+1

確かに...私はMongoDBにすべてのものを格納する答えを書いて、それから彼は全体の構造を1つのドキュメントとして取り出すことができます。 –

関連する問題