Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > Mysql查询语句实现无限层次父子关系查询

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

作者:HaSaKing_721

这篇文章主要介绍了Mysql查询语句如何实现无限层次父子关系查询问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

一、前言

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

二、相关语法函数介绍

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

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

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

查询字段(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:

Type:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文