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

2023-12-01 0 502
目录
  • 一、前言
  • 二、相关语法函数介绍
  • 三、具体实现
    • 查询父级为 2 的下级 无限级查询
  • 四、效率问题
    • EXPLAN 相关参数
  • 总结

    一、前言

    单表存储上下级关系,使用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

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

    列表化

    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

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

    查询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

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

    四、效率问题

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

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

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

    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

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持悠久资源网。

    收藏 (0) 打赏

    感谢您的支持,我会继续努力的!

    打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
    点赞 (0)

    悠久资源 Mysql Mysql查询语句如何实现无限层次父子关系查询 https://www.u-9.cn/database/mysql/5741.html

    常见问题

    相关文章

    发表评论
    暂无评论
    官方客服团队

    为您解决烦忧 - 24小时在线 专业服务