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

 更新时间:2023年07月12日 08:58:47   作者:HaSaKing_721  
这篇文章主要介绍了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时一般以ISO-8859字符集作为默认的字符集,因此在比较过程中中文编码字符大小写转换造成了这种现象,比较应急的方法是对于包含中文的字段加上"binary"属性,使之作二进制比较
    2008-09-09
  • 数据库工具sysbench安装教程和性能测试例子

    数据库工具sysbench安装教程和性能测试例子

    这篇文章主要介绍了数据库工具sysbench安装教程和性能测试例子,sysbench的一个简明入门教程,包含编译安装过程和主要测试数据,需要的朋友可以参考下
    2014-07-07
  • 对于mysql的query_cache认识的误区

    对于mysql的query_cache认识的误区

    一直以来,对于mysql的query_cache,在网上就流行着这样的说法,对于mysql的query_cache键值就是mysql的query,所以,如果在query中有任何的不同,包括多了个空格,都会导致mysql认为是不同的查询
    2012-03-03
  • MySQL Galera Cluster部署与使用

    MySQL Galera Cluster部署与使用

    MySQLGaleraCluster是一种高可用、同步复制的数据库解决方案,本文主要介绍了MySQL Galera Cluster 部署与使用,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • MySQL优化表时提示 Table is already up to date的解决方法

    MySQL优化表时提示 Table is already up to date的解决方法

    这篇文章主要介绍了MySQL优化表时提示 Table is already up to date的解决方法,需要的朋友可以参考下
    2016-11-11
  • mysql排名函数ROW_NUMBER、RANK、DENSE_RANK、NTILE详解

    mysql排名函数ROW_NUMBER、RANK、DENSE_RANK、NTILE详解

    文章介绍了SQL中的ROW_NUMBER()、RANK()、DENSE_RANK()和NTILE()函数的定义、用法和区别,这些函数在分页查询、排名等场景中非常有用
    2025-03-03
  • MySQL分区表使用保姆级教程

    MySQL分区表使用保姆级教程

    分区表是将大表数据按条件拆分存储在不同磁盘位置的数据库优化技术,它通过将数据分散到多个独立分区中,显著减少查询扫描范围,提升查询性能,下面就来详细的介绍一下
    2026-03-03
  • mysql数据库隔离级别详解

    mysql数据库隔离级别详解

    SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的,下面这篇文章主要给大家介绍了关于mysql数据库隔离级别的相关资料,需要的朋友可以参考下
    2022-06-06
  • Mysql中的多级复制方式

    Mysql中的多级复制方式

    这篇文章主要介绍了Mysql中的多级复制方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • MySQL查询和筛选存储的JSON数据的操作方法

    MySQL查询和筛选存储的JSON数据的操作方法

    MySQL是常用的关系型数据库管理系统,为了支持非结构化数据的存储和查询,MySQL引入了对JSON数据类型的支持,JSON是一种轻量级的数据交换格式,在现代应用程序中得到了广泛应用,处理和存储非结构化数据变得越来越重要,本文给大家介绍mysql查询JSON数据的相关知识,一起看看吧
    2024-01-01

最新评论