1
public function get_children($id)
{
        $query = $this->db->query("SELECT 
          @last_id := id AS id,
          parent_id,
          FIO,
          @depth := IF(parent_id = ".$id.", 1, @depth + 1) AS depth,
          @first := IF(id = ".$id.", 'first', null) AS first
          FROM 
          users 
          FORCE INDEX (index_parent_id, PRIMARY, index_both),
          (SELECT @last_id := ".$id.", @depth := -1) vars
          WHERE id = ".$id." OR parent_id = @last_id OR parent_id = ".$id."
          ");

    return $query;

}

neighbor-model-listとこのクエリを使用して、子ノードのレベルの深さを増やすにはどうすればよいですか?これで、ルートの親(関数のidで選択)とその子が得られますが、それ以上のアイデアは得られませんか?

foreach($query->result() as $q){


    if($q->first == 'first')
    {
        $parent_id = $q->parent_id;
        break;
    }


}
function print_list($array, $parent=0) {
        print "<ul>";
        foreach ($array as $row) {
            if ($row->parent_id == $parent) {
                print "<li>$row->FIO";
                print_list($array, $row->id);  # recurse
                print "</li>";
        }   }
        print "</ul>";
    }
echo print_list($query->result(), $parent_id);

次に、それをビューファイルにレンダリングします...mysqlクエリの深さを増やすために何を変更または確認するかについてのヘルプまたはアドバイスをお願いします。

4

1 に答える 1

1

データベースのスキーマについてはよくわかりませんが、これは基本的に、あなたが探しているものの簡略化されたバージョンです。基本的には自分自身を呼び出す関数が必要ですが、引数が変わります。

この場合、parent_id = $parent_id (ルートの parent_id が 0 であると想定) を持つユーザーを探し、各ユーザーについて、parent_id = $id ($id はユーザーの ID) を持つ他のユーザーを探します。 )基本的に、無限の深さがあります

<?
function print_list($parent_id) {
    $query = "SELECT * FROM users WHERE parent_id=".$parent_id;

    print "<ul>";
    foreach($query->result() as $q) {
        $id = $q->id;
        print "<li>";
            print $q->FIO;
        print "</li>";
        print_list($id); //Here, it calls itself again
    }
    print "</ul>";
}
print_list(0); //Assuming the root-parent-id number is 0
于 2012-07-10T03:41:27.283 に答える