建议SQL查询从Adjacency List Model中检索所有叶节点

时间:2012-08-01 18:30:36

标签: mysql sql database

我在mysql中有一个像这样的表结构:

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

基本上它是数据库驱动菜单的设计,根菜单有parent_id 0,而子菜单在parent_id字段上指定了根菜单。它可以达到3-4级。

现在,我需要在根菜单下找到所有子菜单。我可以很容易地为一个级别的菜单做到这一点,但我无法追溯到那个。我可以通过编写一个程序(通过合并结果集)来做到这一点,但如果我只使用SQL就能做到这一点,那将会更容易和方便。

我无法更改表的任何结构或以其他方式修改系统。请帮忙。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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;