2012-07-08 34 views
5

我有一張表,其中產品根據樹狀結構等分層關係進行分類。我不得不在任何級別上選擇一個類別和所有子類別。請參見下面的圖:用於分層關係的SQL

enter image description here

例如我想要一個SQL語句,當我查詢傳遞ID = 11,則返回我(19,20,21,22,23,24,25,26)

回答

1
SELECT * FROM `Products` 
WHERE parentId IN (
    SELECT id FROM `Products` 
    WHERE parentId = 11) 

注意:這不會,如果工作你的層次比2層更深。

9

有幾種不同的方式來存儲MySQL中的heirarchical數據。查看比爾卡爾文的presentation,演示了四種選擇。

  • 鄰接表
  • 路徑枚舉
  • 嵌套集合
  • 關閉表

您正在使用鄰接表模型用於存儲heirarchical數據,但不幸的是,這是最難您可以選擇查詢子樹的模型。

nested sets query subtree

的選項有:

  • 切換到不同的模式。
  • 將查詢限制在n個級別。
  • 使用存儲過程遞歸查詢。有關詳細信息,請參閱Quassnoi的系列文章 - Hierarchical queries in MySQL
1

您可以稍微更改一下數據結構以包含計算的連接列。有一個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/ 
0

這是凌亂的,你就必須做ñ工會,其中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)))