2013-11-09 23 views
1

我必須要管理員我不是SQL-guru,也許這個查詢非常簡單,但我無法設法編寫它。基本上所有頁面都使用鄰接表模型排列(我跟蹤深過):網站層次結構的鄰接列表模型,如何以特定順序檢索所有頁面?

+----+---------------+-------------------+-----------+ 
| id | title   | level | position | parent_id | 
+----+---------------+-------+-----------+-----------+ 
| 1 | Home   | 0  | 0   | null  | 
+----+---------------+-------+-----------+-----------+ 
| 2 | Resources  | 0  | 1   | null  | 
+----+---------------+-------+-----------+-----------+ 
| 3 | About   | 0  | 2   | null  | 
+----+---------------+-------+-----------+-----------+ 
| 4 | Documents  | 1  | 0   | 2   | 
+----+---------------+-------+-----------+-----------+ 
| 5 | Tutorials  | 1  | 1   | 2   | 
+----+---------------+-------+-----------+-----------+ 

注意,位置是相同的父是唯一的。

我試圖實現是排序家長和位置,但父類別應列出正確的前它的孩子。這是顯而易見的,不起作用:

SELECT * FROM PAGE p 
ORDER BY parent_id, position 

而結果是第一個表。我需要的是以下內容:

+----+---------------+-------------------+-----------+ 
| id | title   | level | position | parent_id | 
+----+---------------+-------+-----------+-----------+ 
| 1 | Home   | 0  | 0   | null  | 
+----+---------------+-------+-----------+-----------+ 
| 2 | Resources  | 0  | 1   | null  | // Parent of 4, 5 
+----+---------------+-------+-----------+-----------+ 
| 4 | Documents  | 1  | 0   | 2   | // Child of Resource 
+----+---------------+-------+-----------+-----------+ 
| 5 | Tutorials  | 1  | 1   | 2   | // Child of Resource 
+----+---------------+-------+-----------+-----------+ 
| 3 | About   | 0  | 2   | null  | 
+----+---------------+-------+-----------+-----------+ 

這是可能的在MySQL中,不支持遞歸?

+1

此任務需要遞歸(正如您已經寫過的),而MySQL不支持公用表表達式(CTE)。所以不能在MySQL中使用SQL聲明式地完成。你必須做程序。鄰接列表模型是否適合你? – Fabian

+0

@Fabian Nope,它不是固定的。 – gremo

+0

一個簡單的解決方案是將每個節點的完整路徑存儲爲一個字符串,例如「Documents」條目的「0001/0002/0004」。從幻燈片55開始,可以將[比爾卡爾溫的幻燈片](http://www.slideshare.net/billkarwin/sql-antipatterns-strike-back)作爲參考。這可以混合鄰接列表模型或者例如封閉表,這取決於你的需求。 – Fabian

回答

0

當您可以限制查詢時,您可以使用自聯接。或者嘗試一個嵌套集或celko樹。

相關問題