CREATE TABLE Area ([id] [int] NOT NULL,[name] [nvarchar] (50) NULL,[parent_id] [int] NULL,[type] [int] NULL );
#comment_id | parent_id | ##authorcomment | |
0 | 小明 | #我不大認同這個觀點 | |
1 | 小張 | 我也不認同 | |
##2 | 小紅 | 我同意樓上 | |
#1 | 小全 | 你為什麼不認同呢 | |
4 | 小明 | 我以前遇過這情況 | |
5 | 小張 | 那也不代表你所說是對的 | |
5 | 小新 | 這個視情況而定吧 |
SELECT c1.*, c2.* FROM comments c1 LEFT OUTER JOIN comments c2 ON c2.parent_id = c1.comment_id;
然而這個查詢只能取得兩層的資料。這種樹的特性就是可以任意深地拓展,你需要有對應的方法來取得它的深度資料。例如,可能需要計算一個評論分支的數量,或計算一個機械設備的所有的總開銷。
comment | #1 | ##1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
我不大認同這個觀點 | 2 | 1/2 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#我也不認同 | #3 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
小紅 | 我同意樓上 | 4 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
小全 | 為什麼不認同呢 | ##5 | #1/ 4/5 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
我以前遇過這情況 | #6 | 1/4/5/6 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
那也不代表你所說是對的 | 7 | 1/4/5/7 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
這個視情況而定吧 | # |
comment_id | nsleft | nsright | author | comment |
1 | 1 | 14 | 小明 | 我不大认同这个观点 |
2 | 2 | 5 | 小张 | 我也不认同 |
3 | 3 | 4 | 小红 | 我同意楼上 |
4 | 6 | 13 | 小全 | 你为什么不认同呢 |
5 | 7 | 12 | 小明 | 我以前遇到过这情况 |
6 | 8 | 9 | 小张 | 那也不代表你所说是对的 |
7 | 10 | 11 | 小新 | 这个视情况而定吧 |
SELECT c2.* FROM comments AS c1 JOIN comments AS c2 ON c2.nsleft BETWEEN c1.nsleftAND c1.nsright WHERE c1.comment_id = 4;
SELECT c2.* FROM comments AS c1 JOIN comments AS c2 ON c1.nsleft BETWEEN c2.nsleftAND c2.nsright WHERE c1.comment_id = 6;
SELECT parent.* FROM comments AS c JOIN comments AS parent ON c.nsleft BETWEEN parent.nsleft AND parent.nsrightLEFT OUTER JOIN comments AS in_between ON c.nsleft BETWEEN in_between.nsleft AND in_between.nsrightAND in_between.nsleft BETWEEN parent.nsleft AND parent.nsright WHERE c.comment_id = 6AND in_between.comment_id IS NULL;
祖先 | 后代 | 祖先 | 后代 | 祖先 | 后代 | 祖先 | 后代 |
1 | 1 | 1 | 7 | 4 | 6 | 7 | 7 |
1 | 2 | 2 | 2 | 4 | 7 | ||
1 | 3 | 2 | 3 | 5 | 5 | ||
1 | 4 | 3 | 3 | 5 | 6 | ||
1 | 5 | 4 | 4 | 5 | 7 | ||
1 | 6 | 4 | 5 | 6 | 6 |
INSERT INTO treepaths (ancestor, descendant)SELECT t.ancestor, 8FROM treepaths AS tWHERE t.descendant = 6UNION ALL SELECT 8, 8;
DELETE FROM treepaths WHERE descendant = 7;
方案 | 表数量 | 查询子 | 查询树 | 插入 | 删除 | 引用完整性 |
邻接表 | 1 | 简单 | 困难 | 简单 | 简单 | 是 |
枚举路径 | 1 | 简单 | 简单 | 简单 | 简单 | 否 |
嵌套集 | 1 | 困难 | 简单 | 困难 | 困难 | 否 |
闭包表 | 2 | 简单 | 简单 | 简单 | 简单 | 是 |
以上是資料庫表設計-鄰接表、路徑枚舉、巢狀集、閉包表的詳細內容。更多資訊請關注PHP中文網其他相關文章!