根据父ID选择列值而不需要PHP循环?

时间:2013-01-17 04:17:50

标签: php mysql

我目前有一张桌子,其中包括:

ID | pagetitle | parent
1  |  Page 1   |   0
2  |  Page 2   |   1
3  |  Page 3   |   2

我正在尝试选择所有页面及其父级的pagetitle。

目前我正在循环PHP中的结果,抓住那些父母的页面的页面标题,看起来很难看:

function showPageParent($pageid) {
    do {
        $result = mysql_query("SELECT parent FROM pages WHERE id=" . qt($pageid));
        while($row = mysql_fetch_array($result)) {
            $crumbs[] = $row['parent'];
            $pageid1 = $row['parent'];
        }
    } while($pageid1!=0);
    sort($crumbs);
    foreach($crumbs as $crumb) {
        $result = mysql_query("SELECT id,pagetitle FROM pages WHERE id=" . $crumb);
        while($row = mysql_fetch_array($result)) {
            $out .= $row['pagetitle'] . " > ";
        }
    }
    if(count($crumbs) < 2) {
        return showPageTitle($pageid);
    } else {
        return $out;
    }
}

它有效,但它是非常古老的代码,我正在重写这个系统很多的过程,并且很想通过一次调用数据库来返回这样的东西:

ID | pagetitle | parent-pagetitle

这是否可以使用内部选择?

修改

我想指出,我不是PHP的原作者,我知道它编写得不好:p

2 个答案:

答案 0 :(得分:1)

简而言之,您正在尝试管理非分层数据库中的分层数据。适当建模的一个更好的方法是nested set model,这是非常好的解释here。该文章还向您展示了为什么简单的相邻列表模型(您当前的模型)中的分层数据几乎无法使用。另请查看materialized pathsnested interval树模型。

答案 1 :(得分:1)

select p.id
     , p.title
     , pp.id
     , pp.title parentitle
  from pages p
  left
 outer
  join pages pp
    on p.parent = pp.id

如果需要,您可以为每个深度级别添加另一个连接。