1

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

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

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

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

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

4

2 回答 2

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)
于 2012-08-01T18:42:32.040 回答
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;
于 2012-08-04T05:39:59.247 回答