我在mysql中有一个像这样的表结构:
________________________
| id | int(auto) |
|------------------------|
| name | varchar |
|------------------------|
| link | varchar |
|------------------------|
| parent_id| int |
|________________________|
基本上它是数据库驱动菜单的设计,根菜单有parent_id
0,而子菜单在parent_id
字段上指定了根菜单。它可以达到3-4级。
现在,我需要在根菜单下找到所有子菜单。我可以很容易地为一个级别的菜单做到这一点,但我无法追溯到那个。我可以通过编写一个程序(通过合并结果集)来做到这一点,但如果我只使用SQL就能做到这一点,那将会更容易和方便。
我无法更改表的任何结构或以其他方式修改系统。请帮忙。
答案 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;