2012-08-01 42 views
1

我有一個表結構在MySQL這樣的檢索所有葉子節點:建議SQL查詢從鄰接表型號

________________________ 
| id  | int(auto) |  
|------------------------| 
| name | varchar  | 
|------------------------| 
| link | varchar  | 
|------------------------| 
| parent_id| int   | 
|________________________| 

基本上它是一個數據庫驅動的菜單設計,根菜單有parent_id 0 ,而子菜單的根菜單在parent_id字段中指定。它可以達到3-4級。

現在,我需要找到根菜單下的所有子菜單。我可以很容易地做到這一點的菜單,但我不能遍歷它。我可以通過編寫一個程序(通過合併結果集)來實現這一點,但如果我只用SQL就可以做到這一點,它將變得更加簡單和方便。

我無法更改表格的任何結構或以其他方式修改系統。請幫忙。

+0

有一個很好的理由,這種數據通常以不同的方式存儲。 http://en.wikipedia.org/wiki/Nested_set_model – ceejayoz 2012-08-01 18:35:06

+0

閱讀此http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ – hackattack 2012-08-01 18:38:13

+0

謝謝。這篇文章非常有用。特別是「從鄰接列表模型中檢索完整樹」與我的回答太接近了,但是我不需要將它們放在關卡上,而需要整合到一行上。可能嗎。 – biztiger 2012-08-01 19:06:54

回答

0

我用下面的查詢來獲取所有的孩子菜單id(逗號分隔)的根菜單(在這個查詢中它是2)。它可以支持多達3個級別。我知道查詢沒有進行優化並且出現了性能問題,但我仍然認爲這是實現解決方案的唯一方法,而不使用過程(我無法使用)。

select group_concat(lev0) from 
(select concat_ws(',',lev2,group_concat(lev3)) as lev0 from 
(SELECT t2.id as lev2, 
t3.id as lev3, 
t4.id as lev4 
FROM menus AS t1 
LEFT JOIN menus AS t2 ON t2.parent_id = t1.id 
LEFT JOIN menus AS t3 ON t3.parent_id = t2.id 
LEFT JOIN menus AS t4 ON t4.parent_id = t3.id 
WHERE t1.id = '2') t0 group by lev2) t; 
+0

嘿,夥計!你能幫我在這裏嗎?你能告訴我如何將這個查詢合併成一列而不是連接逗號嗎? – Pranav 2015-07-04 09:15:31

1

這會給你所有的父母與孩子的:

SELECT t1.name AS parentName, t1.Link AS parentLink 
t2.name AS childName, t2.link AS childLink 
FROM table t1 
LEFT OUTER JOIN table t2 ON (t2.parent_id = t1.id) 

如果你不想根級別:

SELECT t1.name AS parentName, t1.Link AS parentLink 
t2.name AS childName, t2.link AS childLink 
FROM table t1 
INNER JOIN table t2 ON (t2.parent_id = t1.id) 
+0

我不需要列出所有節點及其子節點,但是需要列出任何特定節點的所有級別的子節點。 – biztiger 2012-08-01 19:08:38