我想不使用函数,直接在sql中实现递归查询一个节点的所有父节点,并求所有父节点的id的和,我的思路是在select字段中使用变量和子查询,但查询结果跟想象的不一样!!
表结构是这样的:
建表语句是:
create table menu(
id int auto_increment,
name VARCHAR(255),
parent_id int,
PRIMARY KEY(id)
) ENGINE=INNODB auto_increment=1 default charset = "utf8";
insert into menu(id, name, parent_id) values(1, 'Home', 0);
insert into menu(id, name, parent_id) values(2, 'About', 1);
insert into menu(id, name, parent_id) values(3, 'Contact', 1);
insert into menu(id, name, parent_id) values(4, 'Legal', 2);
insert into menu(id, name, parent_id) values(5, 'Privacy', 4);
insert into menu(id, name, parent_id) values(6, 'Products', 1);
insert into menu(id, name, parent_id) values(7, 'Support', 1);
以id=5的节点为例,找出这个节点的所有父节点,并求这些父节点的id的和,sql如下,执行结果是正确的:
select @r := 5, (select SUM(p_id) from (
SELECT
(SELECT @r := parent_id FROM menu WHERE id = @r) AS p_id
FROM
menu h
WHERE @r <> 0 ) t) as num
查询结果:id=5的节点,其父节点有4、2、1、0,sum为7,结果是正确的:
但在此基础上,计算所有节点的,结果却跟理论上的不对:
select menu.id, @r := menu.id, (select SUM(p_id) from (
SELECT
(SELECT @r := parent_id FROM menu WHERE id = @r) AS p_id
FROM
menu h
WHERE @r <> 0 ) t) as num
from menu
结果:
怎么会都是0呢?不明白啊