相关文章推荐
阳光的枇杷  ·  pomelo架构 ...·  1 周前    · 
火星上的烤地瓜  ·  JavaScript生成 5 ...·  3 天前    · 
活泼的金针菇  ·  Excel VBA ...·  10 月前    · 
笑点低的猴子  ·  java.util.zip.ZipExcep ...·  11 月前    · 

主要利用 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,
 type_name ,
 ischild
 SELECT
  t1.order_num,
  t1.id,
  t1.type_name,
  ( find_in_set( parent_id, @pids ) > 0, @pids := concat( @pids, ',', id ), '0' ) AS ischild 
  ( 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 
WHERE
 ischild != '0' or id = 'f6d225fdff64e96123aaf251e1b52bc1' -- (带本级)
 -- ischild != '0'(不带本级)

查询所有父级

SELECT
	order_num,
	type_name ,
	isParent
	SELECT
		t1.order_num,
		t1.id,
		t1.type_name,
		( find_in_set( id, @ids ) > 0, @ids := concat( @ids, ',', parent_id ), '0' ) AS isParent 
		( 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 
WHERE
	isParent != '0'

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

-- 隐式查询 select 列名.... from 表1,表2 where 连表得条件。 -- 连表查询时,如果不使用连表条件则出现笛卡尔集。 -- 所谓笛卡尔集 就是A表中每一条记录关联B中中得每条记录 -- 1.查询每一个... 当我们进⾏语句查询的时候,总会遇到我们需要的条件需要通过另⼀个查询语句查询出来后才能进⾏,就是说A 查询语句需要依赖B 查询语句的查询结果,B 查询就是⼦查询,A 查询语句就是主查询,⼀个SQL语句可以包含多个⼦查询mysqlBUS_COMPANY表结构COMPANY_NO PARENT_ID-1 -20 -11 02 -13 24 ... SELECT * FROM table_name WHERE Id=‘4’ --表的主键ID UNION ALL SELECT T0.* FROM TEMP,table_name T0 WHERE TEMP.Id=T0.ParentId --子级ID==父级ID SELECT * FROM TEMP; –根据指定节点ID获取所有父节点– WITH TEMP AS SELECT * FROM table_name WHERE Id=‘3 WITH RECURSIVE 则是一个递归的查询子句,他会把查询出来的结果再次代入到查询子句中继续查询sql中WITH xxxx AS () 是对一个查询子句做别名,同时数据库会对该子句生成临时表;需要递归查询根据分类id为1查询出1-1,2-1的子分类和子子分类。查询结果如上:查询顺序从子到父。有一个分类表sort。...... SQL 中的 SELECT 命令不仅能够直接用来查询数据库中的数据,还能够嵌入到 WHERE 中作为子查询语句,或者将查询结果插入到另一个表中。   将子查询用于 WHERE 子句   子查询能够与 SELECT、INSERT、UPDATE 和 DELETE 语句一起使用。   下面以 SELECT 语句作为示例: SELECT id, name FROM table1 WHERE id in ( SELECT id FROM table2);   在上面所给的例子中,我们将子查询的结果作为一个集合,使用 in 成员测试运算来筛选出同时存在于 table1 和 table2 (--下级父项 select materialshelf_id,materialshelf_pid,materialshelf_name from materialshelf where materialshelf_id = 5 --子级id union all --递归结果 1.子查询:出现在Where子句中的Select语句被称为子查询(subquery),子查询返回了一个集合,可以通过与这个集合比较来确定另一个查询集合。- 如果表达式的值至少与子查询的某一个值相比较满足θ关系,则“表达式 θ some (子查询)”的结果便为真;- 如果表达式的值与子查询的结果的所有值相比较都满足θ关系,则“表达式 θ all(子查询)”的结果便为真。2.三种类型的子查询:(NOT)IN-子查询;非相关子查询:内层查询独立进行,没有涉及任何外层查询相关信息的子查询。表达式 in (子查询) DROP TABLE IF EXISTS `merchant_region`; CREATE TABLE `merchant_region` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) NULL DEFAULT NULL, `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, PRIMAR