我目前有一张桌子,其中包括:
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
答案 0 :(得分:1)
简而言之,您正在尝试管理非分层数据库中的分层数据。适当建模的一个更好的方法是nested set model,这是非常好的解释here。该文章还向您展示了为什么简单的相邻列表模型(您当前的模型)中的分层数据几乎无法使用。另请查看materialized paths或nested 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
如果需要,您可以为每个深度级别添加另一个连接。