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中,不支持遞歸?
此任務需要遞歸(正如您已經寫過的),而MySQL不支持公用表表達式(CTE)。所以不能在MySQL中使用SQL聲明式地完成。你必須做程序。鄰接列表模型是否適合你? – Fabian
@Fabian Nope,它不是固定的。 – gremo
一個簡單的解決方案是將每個節點的完整路徑存儲爲一個字符串,例如「Documents」條目的「0001/0002/0004」。從幻燈片55開始,可以將[比爾卡爾溫的幻燈片](http://www.slideshare.net/billkarwin/sql-antipatterns-strike-back)作爲參考。這可以混合鄰接列表模型或者例如封閉表,這取決於你的需求。 – Fabian