• @@mysql 父子 关系 无限查询 改进版


    https://blog.csdn.net/qq_28369007/article/details/119144890

    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
    ————————————————
    版权声明:本文为CSDN博主「HaSaKing_721」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_28369007/article/details/119144890

  • 相关阅读:
    OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa
    Java实现 LeetCode 257 二叉树的所有路径
    Java实现 LeetCode 257 二叉树的所有路径
    Java实现 LeetCode 257 二叉树的所有路径
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 241 为运算表达式设计优先级
    Java实现 LeetCode 241 为运算表达式设计优先级
    Java实现 LeetCode 241 为运算表达式设计优先级
  • 原文地址:https://www.cnblogs.com/wl-blog/p/15199903.html
Copyright © 2020-2023  润新知