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

それは機能しますが、非常に古いコードです。私はこのシステムの多くを書き直している最中であり、データベースへの 1 回の呼び出しでこのようなものを返すようにしたいと考えています。

ID | pagetitle | parent-pagetitle

これは内部選択を使用して可能ですか?

編集

指摘しておきたいのですが、私は PHP の最初の作成者ではありません。

4

2 に答える 2

1

つまり、非階層型データベースで階層型データを管理しようとしています。これを適切にモデル化するためのより良い方法の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 に答える