sql语句查询所有子集和所有父级

前提

主要利用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'

自己动手试试吧。
当然,并不是只能传递一个值,多个值也是可以的啊
在这里插入图片描述
这样就会查询出多个子集的上级或者多个上级的子集集合啦。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zwjzone/article/details/130688822
今日推荐