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并搜索具有此类游戏的游戏以及与此游戏相同id的其他游戏。parent_id如果它是父游戏,它只会寻找与parent_id它相同的游戏id

问题是......它并不总是有效。我在数据库中有四个游戏:

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

前两个作品,最后两个作品 - 只有孩子(id = 21)显示父母。

4

3 回答 3

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 回答
1

对于关系数据库,您可能无法做到这一点。RDBMS 不打算管理任何形式的树。

可以在一些简单的情况下,比如一级层次结构,但是一旦它变得更复杂,它就会变得越来越混乱。

保持你的结构,你必须每个 LEVEL 做一个 JOIN,这意味着提前知道深度。

将树存储在数据库中的一种解决方案称为嵌套树,它基本上存储每行的间隔,但自己实现有点复杂。

看看维基百科的解释。然而,有一些库允许您以编程方式抽象此类操作。

于 2012-09-20T09:33:23.963 回答
0

在发布我的问题后,我尝试了另一种解决方案。有趣的是,我用这个坐了一个多小时,在浪费了你的时间之后,我提出了解决方案;)

无论如何,这里是:

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 回答