2015-02-10 49 views
0

首先,我想說我已經做了一些研究,但我仍然無法在我的問題上得到明確的答案。請隨時給我鏈接我可能錯過的地方。SQL加入樹狀結果分組

我一直使用包含我網站所有數據的簡單.json文件(手寫)。這由JQuery解析,然後由它構建整個頁面(請參閱my personnal webpage)。出於許多原因(易於編輯,即使在javascript被阻止時也有工作的網頁),我想構建它的PHP/MySQL版本。

我的問題是將我的.json文件的樹結構轉換爲單個SQL查詢。

我的數據庫有pages,articlescitations的表格,每個表格都有一個ID以及一對多模型中的外鍵(對那裏的父親)。

 Pages 
---------------------- 
Page_ID | Page_Title 
---------------------- 
    0 | About 
    2 | Work 
    3 | Publication 


      Articles 
------------------------------------ 
Article_ID | Page_ID | Article_Title 
------------------------------------ 
    0  | 0  | About me 
    1  | 3  | Articles 


       Citations 
----------------------------------------- 
Citation_ID | Article_ID | Citation_Title 
----------------------------------------- 
    0  |  3  | My fst quote 
    1  |  3  | My snd quote 

到目前爲止,我已經建立了以下查詢:

SELECT * FROM pages 
LEFT OUTER JOIN articles 
    ON pages.Page_ID = articles.Page_ID 
LEFT OUTER JOIN citations 
    ON articles.Article_ID = citations.Article_ID 
ORDER BY pages.Page_Order IS NULL, pages.Page_Order ASC 

然而,這讓我越來越具有多個子/大兒子多時間元素。

有更好的方法來表示一棵樹嗎?我試着看着GROUP BY,但那隻給了我第一個孩子。

+0

您可能想要提供樣本數據和預期結果。 – 2015-02-10 06:18:02

+0

我已經添加了一些例證數據。至於預期的結果,我不知道他們應該如何(這是我的問題的重點) – Amxx 2015-02-10 06:28:05

+0

現在,考慮到這些數據,請解釋爲什麼你的查詢不能滿足你的需求,你想得到什麼代替。 – 2015-02-10 06:34:57

回答

0

如果您的目標是獲取所有數據來構建樹結構,那麼沒有比上述查詢更好的方法。您不應該關心重複問題,因爲無論如何您都必須解析數據,而且您希望一次加載數據庫中的所有數據這一事實表明您的數據庫根本不大。只需按順序添加article_id和citation_id來擴展order by子句,以使整個數據集正確排序,以便您可以通過它並構建樹。

也就是說,您可以通過發出多個查詢,首先獲取所有頁面,然後查看每個頁面的所有文章,然後查看每篇文章的所有引用來擺脫重複問題。但是,這可能會更慢,因爲你會有很多數據庫往返旅行。爲了使這種解決方案有效,您必須調整用戶界面以根據請求動態加載數據。例如,僅顯示一個頁面列表,並且當用戶單擊一個頁面時,將執行一個查詢以獲取該單個頁面的文章。