如何让MySQL中单句实现无限层次父子关系查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让MySQL中单句实现无限层次父子关系查询相关的知识,希望对你有一定的参考价值。

参考技术A 表结构和数据
CREATE TABLE table1(id int, name varchar(10), parent_id int);
INSERT table1 VALUES
(1, ‘Home’, 0),
(2, ‘About’, 1),
(3, ‘Contact’, 1),
(4, ‘Legal’, 2),
(5, ‘Privacy’, 4),
(6, ‘Products’, 1),
(7, ‘Support’, 2);
查询 id = 5 的所有父级
SELECT ID.level, DATA.* FROM(
SELECT
@id as _id,
( SELECT @id := parent_id
FROM table1
WHERE id = @id
) as _pid,

Mysql 查询语句实现无限层次父子关系查询

目录

一、前言

二、相关语法函数介绍

三、具体实现

四、效率问题


一、前言

单表存储上下级关系,使用mysql 内置函数循环递归查出来


二、相关语法函数介绍

@

 @是用户变量,@@是系统变量。

:= 

不只在set和update时时赋值的作用,在select也是赋值的作用。

group_concat()  

将group by产生的同一个分组中的值连接起来,返回一个字符串结果。

FIND_IN_SET()

查询字段(strlist)中包含(str)的结果,返回结果为null或记录


三、具体实现

创建表


查询父级为 2 的下级  无限级查询

	SELECT
		@ids AS _ids,
		( SELECT @ids := GROUP_CONCAT( descendant ) FROM relation WHERE FIND_IN_SET( ancestor, @ids ) ) AS cids,
		@l := @l + 1 AS LEVEL 
	FROM
		relation,
		( SELECT @ids := 2, @l := 0 ) b 
	WHERE
		@ids IS NOT NULL 

列表化 

SELECT
	descendant.LEVEL,
	DATA.* 
FROM
	(
	SELECT
		@ids AS _ids,
		( SELECT @ids := GROUP_CONCAT( descendant ) FROM relation WHERE FIND_IN_SET( ancestor, @ids ) ) AS cids,
		@l := @l + 1 AS LEVEL 
	FROM
		relation,
		( SELECT @ids := 2, @l := 0 ) b 
	WHERE
		@ids IS NOT NULL 
		) descendant,
	sys_dept_relation DATA 
WHERE
	FIND_IN_SET( DATA.descendant, descendant._ids ) 
ORDER BY
	LEVEL,
	DATA.descendant


 查询ID为 8 的上级  无限级查询

	SELECT
		@id AS _id,
		( SELECT @id := ancestor FROM relation WHERE descendant = @id ) AS _pid,
		@l := @l + 1 AS LEVEL 
	FROM
		relation,
		( SELECT @id := 8, @l := 0 ) b 
	WHERE
		@id > 0 

四、效率问题

我目前测试表有8千多数据量

 


EXPLAN 相关参数

Select_type:

PRIMARY:查询中最外层的SELECT(如两表做UNION或者存在子查询的外层的表操作为PRIMARY,内层的操作为UNION)

DERIVED:被驱动的SELECT子查询(子查询位于FROM子句)

UNCACHEABLE SUBQUERY一个子查询的结果不能被缓存,必须重新评估外链接的第一行

Type:

NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。

index: Full Index Scan,index与ALL区别为index类型只遍历索引树

System:system是const类型的特例,当查询的表只有一行的情况下,使用system

 

 

以上是关于如何让MySQL中单句实现无限层次父子关系查询的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 查询语句实现无限层次父子关系查询

Mysql 查询语句实现无限层次父子关系查询

Mysql 查询语句实现无限层次父子关系查询

如何从父子层次结构表创建查询

如何从单个 MySQL 查询中获取 Parent 的所有子记录 [重复]

MySQL递归查询,实现上下级联查,父子级查询