2012-09-20 77 views
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游戏。

问题是......它并不总是工作。我有四场比赛中,DB:

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

前两部作品,最后两个 - 独生子女(id = 21)显示父。

+0

你可以请更清楚你的问题,并把你想要的结果 –

回答

1

你可能不能做与关系数据库。 RDBMS不打算管理任何形式的树。

可以在一些简单的情况下,像一级层次结构,但只要它变得越来越复杂,它变得越来越混乱。

保持你的结构,你必须使ONE JOIN每级,这意味着要事先知道深度。

存储树木数据库中的解决方案被称为嵌套的树状结构,它基本上存储间隔在每行,但它是一个有点复杂,自己执行。

看看Wikipedia explanation。然而,有库允许你以编程方式抽象这样的操作。

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(); 
} 
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