2013-01-17 21 views
1

我現在有除其他事項外持有的表:根據父ID選擇列值,而不需要PHP循環?

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

我想選擇所有的頁面,與他們的父母一起PAGETITLE。

目前,我通過PHP的結果循環,抓住pagetitles與家長的網頁,它看起來很醜陋:

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的原作者,我知道它寫得不好:對

+0

也許你也應該使用mysql函數替換。 pdo,mysqli是比mysql函數更好的替代選擇 – ajreal

+0

我使用ezSQL重寫,在新代碼中沒有mysq_ *函數,因爲我正在慢慢地重新編寫它。 –

+0

但是,我不會使用PDO,但我並不打算使用ezSQL,我在一個4人團隊中工作,他們投了ezSQL,這並不可怕。 –

回答

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

如果需要,您可以爲每個深度級別添加另一個連接。

+0

這完全是我所需要的。非常感謝! –

1

總之,你要管理分層數據在非分層數據庫中。對此進行適當建模的更好方法之一是nested set model,這很好地解釋了here。該文章還向您說明了爲什麼簡單相鄰列表模型(您當前的模型)中的分層數據幾乎不可能使用。也請看materialized pathsnested interval樹型號。

+0

我確實喜歡這個想法,我不知道這個項目的範圍或預算。如果他們想重新構建他們的數據庫,並且如果他們想要爲它付錢,它就是客戶。感謝您的鏈接。 –