前提
主要利用find_in_set
函数,还有就是:=
操作符;
不了解的可以去了解一下这两个东西的作用,这里简单说一下:
find_in_set 就是判断以逗号拼接的字符串中是否包含某个字符串,例如 find_in_set('a','a,b,c')
,返回的是a在后边集合中的位置,这里就是1了;
:=:意思是设置值,再增改查中都是一样,比如 select @num:=@num+1 ,就是设置num值递增1。
实例表:
order_num存值规则:
逢9加1,91(不等于大于10,否则出问题),这是另个涉及排序的问题,这里不用关注
。
查询所有子集
SELECT
order_num,
id,
type_name ,
ischild
FROM
(
SELECT
t1.order_num,
t1.id,
t1.type_name,
IF
( find_in_set( parent_id, @pids ) > 0, @pids := concat( @pids, ',', id ), '0' ) AS ischild
FROM
( SELECT order_num, id, type_name, parent_id FROM hw_baseinfo_project_type t WHERE del_flag = 0 ORDER BY order_num ) t1,
( SELECT @pids := 'f6d225fdff64e96123aaf251e1b52bc1' ) t2
) t3
WHERE
ischild != '0' or id = 'f6d225fdff64e96123aaf251e1b52bc1' -- (带本级)
-- ischild != '0'(不带本级)
查询所有父级
SELECT
order_num,
id,
type_name ,
isParent
FROM
(
SELECT
t1.order_num,
t1.id,
t1.type_name,
IF
( find_in_set( id, @ids ) > 0, @ids := concat( @ids, ',', parent_id ), '0' ) AS isParent
FROM
( SELECT order_num, id, type_name, parent_id FROM hw_baseinfo_project_type t WHERE del_flag = 0 ORDER BY order_num desc) t1,
( SELECT @ids := 'f555fe921b95ad59a35394c2d07173b7' ) t2
) t3
WHERE
isParent != '0'
自己动手试试吧。
当然,并不是只能传递一个值,多个值也是可以的啊
这样就会查询出多个子集的上级或者多个上级的子集集合啦。