create table test_tree(
t_id varchar(100),
parent_id varchar(100)
);
insert into test_tree values('a', '');
insert into test_tree values('b', 'a');
insert into test_tree values('c', 'b');
insert into test_tree values('d', 'c');
insert into test_tree values('e', 'd');
insert into test_tree values('f', 'c');
insert into test_tree values('1', '');
insert into test_tree values('2', '1');
insert into test_tree values('3', '2');
insert into test_tree values('4', '3');
insert into test_tree values('5', '4');
insert into test_tree values('6', '3');
查询语句1(字符串,没有结果)
SELECT t_id FROM
(
SELECT * FROM test_tree where parent_id <> ''
) realname_sorted,
(SELECT @pv :='c') initialisation
WHERE (FIND_IN_SET(parent_id, @pv)<> '' And @pv := concat(@pv, ',', t_id));
查询语句2(数字,有结果)
SELECT t_id FROM
(
SELECT * FROM test_tree where parent_id <> ''
) realname_sorted,
(SELECT @pv :='3') initialisation
WHERE (FIND_IN_SET(parent_id, @pv)<> '' And @pv := concat(@pv, ',', t_id));
参考的这篇文章:https://segmentfault.com/a/11...
有点意思的问题。
问题在于where条件
FIND_IN_SET(parent_id, @pv)<> '' And @pv := concat(@pv, ',', t_id)
,如果find_in_set为true
就会执行后面的赋值操作:@pv := concat(@pv, ',', t_id)
@pv
为数字时,赋值结果形如3,4,5
(以数字开头的字符串)@pv
为字母时,赋值结果形如c,d,e
where
条件要为true才会过滤出当前行,这个时候就得了解下mysql认为什么值是true:true
、不为0的数字
、以非0开头的字符串
;可以自行测试如下:这就可以解释为什么@pv为字符串时递归查询的结果始终为Empty,因为
@pv := concat(@pv, ',', t_id)
始终为字符串,且不是数字开头,始终为false