1

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

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

我正在尝试选择所有页面及其父页面标题。

目前我在 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

4

2 回答 2

1

简而言之,您正在尝试管理非分层数据库中的分层数据。对此进行适当建模的更好方法之一是嵌套集模型,这里对此进行了很好的解释。那篇文章还向您展示了为什么简单的相邻列表模型(您当前的模型)中的分层数据几乎无法使用。还要查看物化路径嵌套区间树模型。

于 2013-01-17T04:21:08.723 回答
1
select p.id
     , p.title
     , pp.id
     , pp.title parentitle
  from pages p
  left
 outer
  join pages pp
    on p.parent = pp.id

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

于 2013-01-17T04:44:37.957 回答