0

次のように、に対応するデータベースレコードからプルしたいparent_id

function getChildren($id, $parent_id) {
    $q = $this->db->select('id, name, slug, plat');
    $q = $this->db->from('games');
    $q = $this->db->where('parent_id',$id);
    $q = $this->db->or_where('id',$parent_id);
    $q = $this->db->get();

    return $q->result_array();
}

それは-子供向けのゲームの場合-そのようなゲームや、これと同じ他のゲームを入手parent_idして検索します。親ゲームの場合は、と同じゲームのみを検索します。idparent_idparent_idid

問題は...常に機能しているわけではないということです。私はdbに4つのゲームを持っています:

id  |  parent_id  |  title
15  |  0          |  Abe
19  |  15         |  Abe
20  |  0          |  RE2
21  |  20         |  RE2 DS

最初の2つの作品、最後の2つ-子供(id = 21)のみが親を示します。

4

3 に答える 3

1

おそらく関係データベースではそれができません。RDBMS は、いかなる形式のツリーも管理することを意図していません。

1 レベルの階層など、いくつかの単純なケースでは可能ですが、より複雑になるとすぐに、ますます乱雑になります。

構造を維持するには、LEVEL ごとに ONE JOINを作成する必要があります。これは、事前に深さを知ることを意味します。

ツリーをデータベースに格納するソリューションは Nested Tree と呼ばれ、基本的に各行に間隔を格納しますが、自分で実装するには少し複雑です。

ウィキペディアの説明を見てください。ただし、そのような操作をプログラムで抽象化できるライブラリがあります。

于 2012-09-20T09:33:23.963 に答える
1

このクエリを使用

select 
    * 
from games as g
where parent_id = 0
union all
select
    l.*
from games r 
left join (select * from games) as l on r.id = t.id
where
r.parent_id != 0
于 2012-09-20T09:37:56.363 に答える
0

問題を投稿した直後に、別の解決策を試しました。おかしなことに、私はこれに1時間以上座って、あなたの時間を無駄にした後、私は解決策を思いついた;)

とにかく、ここにあります:

function getChildren($id, $parent_id) {
    $q = $this->db->select('id, name, slug, plat');
    $q = $this->db->from('games');
    $q = $this->db->where('parent_id',$id);
    $q = $this->db->or_where('id',$parent_id);
    $q = $this->db->or_where('parent_id',$parent_id);
    $q = $this->db->where('id !=', $id);
    $q = $this->db->get();

    return $q->result_array();
}
于 2012-09-20T09:36:27.253 に答える