我目前有一个表,其中包含:
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
select p.id
, p.title
, pp.id
, pp.title parentitle
from pages p
left
outer
join pages pp
on p.parent = pp.id
如果需要,可以为每个深度级别添加另一个连接。
简而言之,您正在尝试在非分层数据库中管理分层数据。对其进行适当建模的更好方法之一是嵌套集模型,这里对此进行了很好的解释。这篇文章还向您展示了为什么在一个简单的相邻列表模型(您当前的模型(中的分层数据实际上是不可能使用的。还可以查看物化路径或嵌套的间隔树模型。