添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

参考资料
https://www.cnblogs.com/rainydayfmb/p/8028868.html

存在数据表如下,要求给定分类id,查询所有父级或子级

CREATE TABLE `smdm_item_category` (
  `category_id` double DEFAULT NULL,
  `category_code` varchar(255) DEFAULT NULL,
  `category_name` varchar(255) DEFAULT NULL,
  `parent_category_id` double DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
INSERT INTO `smdm_item_category`(`category_id`, `category_code`, `category_name`, `parent_category_id`) VALUES (1752, 'IP', '间接采购\r\n', 0);
INSERT INTO `smdm_item_category`(`category_id`, `category_code`, `category_name`, `parent_category_id`) VALUES (1753, 'IP-ITEM\r\n', '间接材料\r\n', 1752);
INSERT INTO `smdm_item_category`(`category_id`, `category_code`, `category_name`, `parent_category_id`) VALUES (1773, 'IP-ITEM-CYS\r\n', '印刷品\r\n', 1753);
INSERT INTO `smdm_item_category`(`category_id`, `category_code`, `category_name`, `parent_category_id`) VALUES (1909, 'IP-ITEM-CYS-YHSC', '用户手册\r\n', 1773);
INSERT INTO `smdm_item_category`(`category_id`, `category_code`, `category_name`, `parent_category_id`) VALUES (2230, 'MANUAL,OWNERS', '用户手册\r\n', 1909);

语法介绍:

  1. 函数FIND_IN_SET(str,strlist) : str 要查询的字符串,strlist 需查询的字段,参数以","分隔,形式如 (1,2,6,8,10,22);该函数的作用是查询字段(strlist)中是否包含(str)的结果,返回结果为0 或 str在后边集合strlist中的位置,如 select find_in_set(‘d’,‘a,b,c’) 是 0

  2. if(express1,express2,express3)条件语句,if语句类似三目运算符,当exprss1成立时,执行express2,否则执行express3;

  3. := 在set、update、select时,起到赋值作用,SELECT @pids := 1773 即@pids赋值为1773

查询所有子级(含本级)

SELECT
	category_id ,category_code,category_name
	SELECT
		t1.category_id,
		t1.category_code,
		t1.category_name,
		( find_in_set( parent_category_id, @pids ) > 0, @pids := concat( @pids, ',', category_id ), 0 ) AS ischild 
		( SELECT category_id, category_code,category_name,parent_category_id FROM smdm_item_category t ORDER BY parent_category_id, category_id ) t1,
		( SELECT @pids := 1773 ) t2 
WHERE
	ischild != 0 or category_id = 1773 

查所有父级,含级别

-- 递归查询所有父级,@r后面输入要查询的id
-- T1.lvl 表示层级  @l := 0 初始为0
SELECT T2.category_id, T2.category_code ,T2.category_name,T1.lvl
FROM ( 
    SELECT 
        @r AS _id, 
        (SELECT @r := parent_category_id FROM smdm_item_category WHERE category_id = _id) AS parent_category_id,
				@l := @l + 1 AS lvl
        (SELECT @r := 2230,@l := 0 ) vars, 
        smdm_item_category h 
JOIN smdm_item_category T2 
ON T1._id = T2.category_id
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL,
  `parent_id` bigint DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

#插入数据

insert into `test` (`id`, `name`, `parent_id`) values('1','A','0');
insert into `test` (`id`, `name`, `parent_id`) values('2','B','1');
insert into `test` (`id`, `name`, `parent_id`) values('3','C','1');
insert into `test` (`id`, `name`, `parent_id`) values('4','D','2');
insert into `test` (`id`, `name`, `parent_id`) values('5','E','4');
insert into `test` (`id`, `name`, `parent_id`) values('6','F','1');
insert into `test` (`id`, `name`, `parent_id`) values('7','G','1');

#执行sql

SELECT T2.id, T2.name 
FROM ( 
    SELECT 
        @r AS _id, 
        (SELECT @r := parent_id FROM test WHERE id = _id) AS parent_id, 
        @l := @l + 1 AS lvl 
        (SELECT @r := 5, @l := 0) vars, 
        test h 
JOIN test T2 
ON T1._id = T2.id 
ORDER BY T1.lvl DESC 
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
下面展示一些 内联代码片。
select * from T_SYS_DIC 
start with dic_id = '1000076' CONNECT BY PRIOR dic_id =  parent_dic_id
对应结果:可以看出所有数据均为父 id为 1000
				
with 自定义结果名称(Id,Name,Pid) as (   select Id,Name,Pid from 要查询的表名称where Id ='' --顶级的查询条件,要查询哪个父级的所有子级,条件就写哪个   union all   select 要查询的表名称.Id,要查询的表名称.Name,要查询的表名称.Pid from 要查询的表名称,自定义结果名称 where 要查询的表名称.Pid = 自定义结果名称.Id select * from 自定义结果名称; Id,Name,Pid ..
t1.*, t2.*, IF(FIND_IN_SET(parent_id, @pids) > 0, @pids := CONCAT(@pids, ',', id), '0') AS isChild FROM ( SELECT * FROM rule_enti select b.* from Traffic_Sites b where ParentId = '4' union all select a.* from Traffic_Sites a join t b on a.ParentId=b.SiteId select * from t 调换 SiteId 的位
在数据查询中,从2008开始SQL Server提供了一个新的数据类型hierarchyid,专门用来操作层次型数据结构。   hierarchyid  类型对层次结构树中有关单个节点的信息进行逻辑编码的方法是:对从树的根目录到该节点的路径进行编码。   这种路径在逻辑上表示为一个在根之后被访问的所有子级的节点标签序列。 表示形式以一条斜杠开头,只访问根的路径由单条斜杠表示。 对于根以下的各级,各标签编码为由点分隔的整数序列。 子级之间的比较是按字典顺序比较由点分隔的整数序列。 每个级别后面紧跟着一个斜杠。 因此斜杠将父级与其子级分隔开。 例如,以下是长度分别为 1 级、2 级、2 级、3
开发中大家应该都做过什么类似部门管理这样的功能,一般情况下一个部门下面还有下一级部门(子部门),这个层级就类似一棵树。这种情况下一般会把父级部门和子级部门分成2个或者多个表,这种算是比较常规的做法;有时可能为了数据表管理的方便 就把所有的部门放在一张表里并加上一个字段标识部门之间的隶属关系,这样子看起来有点奇怪,但凑合用用还是Ok的。下面我跟大家分享下我的心得,也就是基于这种设计怎么做数形图,简单的做法就是查询出一个list集合就可以,要怎么办呢先来看下我的数据表  不难看出部门之间用fparent关联,那sql语句怎么写呢,下面是一种偷懒的写法 代码如下: — ||是连接符,level可以
SQL Server是一款关系型数据库管理系统,提供很多强大的功能,如查询所有库名。在SQL Server中,有一个系统表sys.databases,它包含了所有数据库的信息,因此通过查询该表就能查询所有库名。 要查询所有库名,可以使用以下SQL语句: SELECT name FROM sys.databases 该语句简单明了,使用SELECT语句选择返回值,FROM语句选择需要查询的表,WHERE条件可选。在该语句中,我们选择了sys.databases表,该表包含了所有库的信息。通过SELECT语句返回name字段,即库名。执行该语句即可查询所有库名。 除了直接查询sys.databases表,还可以使用以下语句: EXEC sp_databases 该语句是一个系统存储过程,专门用于查询所有库名。它会返回一个结果集,其中包含了所有数据库的信息,如数据库名、数据库大小等。我们只需要取出数据库名即可。该语句的优点是无需手动选择表和字段,更为方便。 综上所述,SQL Server提供了多种方式查询所有库名,每种方式都有其特点和优缺点,开发人员可以根据实际需要选择合适的方式。