2010-06-29 99 views
3

我想知道是否可以在單個數據庫提取中提取類別和子類別。如何在sql中的單個查詢中獲取類別和子類別? (mysql)

我的數據庫表類似於下面

表所示東西

cat_id parent_id 
1  0 
2  1 
3  2 
4  3 
5  3 
6  1 

即當輸入爲3,則所有PARENT_ID爲3和第3排本身和所有的父母行第3行應該被提取。

輸出

cat_id parent_id 
3  2 -> The row 3 itself 
4  3 -> Row with parent as 3 
5  3 -> Row with parent as 3 
2  1 -> 2 is the parent of row 3 
1  0 -> 1 is the parent of row 2 

可以這樣使用存儲過程和循環來完成?如果是這樣,它會是一個單一的數據庫讀取或多個?或者還有其他更好的方法嗎?

謝謝!

+1

這裏是一些寫着:http://dev.mysql.com/tech-resources/articles/hierarchical-data.html 在MySQL中,這是一個很難受...... – 2010-06-29 14:45:43

+0

感謝隊友。好的文章確實!那麼,我遵循相鄰的模型!?嗯...但由於關卡可能會有所不同(表格中可能出現動態條目),我仍然不確定如何實施它。還在想.... – user355562 2010-06-29 15:32:00

+0

2天后仍然卡住! :(不滿意的結果!!! – user355562 2010-07-01 16:15:11

回答

1

如果你問「是否有mysql遞歸查詢?」回答「否」。

但有很好的方法來處理它。

創建輔助表(說CatHierarchy)

CatHierarchy: 
    SuperId, ChildId, Distance 
------------------------------ 
    1   1   0 
    1   2   1 
    2   2   0 

這種冗餘數據容易允許1個查詢選擇任何層次結構,並在2插入支持任何層次(缺失也在1個查詢與刪除級聯的幫助下進行完整性)。

那麼這是什麼意思。您可以跟蹤層級中的所有路徑。 Cat的每個節點必須添加對自身的引用(距離0),然後通過添加有關節點的冗餘數據來支持複製。

要選擇與子類別只寫:

SELECT c.* from Category c inner join CatHierarchy ch ON ch.ChildId=c.cat_id 
     WHERE ch.SuperId = :someSpecifiedRootOfCat 

someSpecifiedRootOfCat - 是參數指定 類的根多數民衆贊成!

-1

這是棘手。我假設你想顯示類別,有點像文件夾視圖?三個字段:MainID,ParentID,Name ...適用於您的表格,它應該像魅力一樣工作。我認爲它被稱爲遞歸查詢?

WITH CATEGORYVIEW (catid, parentid, categoryname) AS 
(
SELECT catid, ParentID, cast(categoryname as varchar(255)) 
    FROM [CATEGORIES] 
WHERE isnull(ParentID,0) = 0 

UNION ALL 

SELECT C.catid, C.ParentID, cast(CATEGORYVIEW.categoryname+'/'+C.categoryname as varchar(255)) 
    FROM [CATEGORIES] C 
    JOIN CATEGORYVIEW ON CATEGORYVIEW.catID = C.ParentID 
) 
SELECT * FROM CATEGORYVIEW ORDER BY CATEGORYNAME 
相關問題