我有一張表,其中產品根據樹狀結構等分層關係進行分類。我不得不在任何級別上選擇一個類別和所有子類別。請參見下面的圖:用於分層關係的SQL
例如我想要一個SQL語句,當我查詢傳遞ID = 11,則返回我(19,20,21,22,23,24,25,26)
我有一張表,其中產品根據樹狀結構等分層關係進行分類。我不得不在任何級別上選擇一個類別和所有子類別。請參見下面的圖:用於分層關係的SQL
例如我想要一個SQL語句,當我查詢傳遞ID = 11,則返回我(19,20,21,22,23,24,25,26)
SELECT * FROM `Products`
WHERE parentId IN (
SELECT id FROM `Products`
WHERE parentId = 11)
注意:這不會,如果工作你的層次比2層更深。
有幾種不同的方式來存儲MySQL中的heirarchical數據。查看比爾卡爾文的presentation,演示了四種選擇。
您正在使用鄰接表模型用於存儲heirarchical數據,但不幸的是,這是最難您可以選擇查詢子樹的模型。
的選項有:
您可以稍微更改一下數據結構以包含計算的連接列。有一個great article向您顯示通用概念(忽略數據庫類型)。
基本上你計算行數列應該包含父母的名單中它例如
項目26將包含\11\
如果你有一個子項,你可以有
\11\subitem\
然後你可以簡單地在你的數據表上做一個類似的檢查,它比迭代搜索快得多,你可以使用存儲過程或觸發器來創建它。
Node ParentNode EmployeeID Depth Lineage
100 NULL 1001 0 /
101 100 1002 1 /100/
102 101 1003 2 /100/101/
103 102 1004 3 /100/101/102/
104 102 1005 3 /100/101/102/
105 102 1006 3 /100/101/102/
這是凌亂的,你就必須做ñ工會,其中n是有多深層次結構是,但它應該工作:
SELECT * FROM `Products` WHERE parentId IN (
SELECT id FROM `Products` WHERE parentId = 11)
UNION
SELECT * FROM `Products` WHERE parentId IN (
SELECT id FROM `Products` WHERE parentId IN (
SELECT id FROM `Products` WHERE parentId = 11))
UNION
SELECT * FROM `Products` WHERE parentId IN (
SELECT id FROM `Products` WHERE parentId IN (
SELECT id FROM `Products` WHERE parentId IN (
SELECT id FROM `Products` WHERE parentId = 11)))