翼度科技»论坛 编程开发 mysql 查看内容

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

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
一、前言

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

二、相关语法函数介绍


    1. @
    复制代码
@是用户变量,@@是系统变量。

    1. := 
    复制代码
不只在set和update时时赋值的作用,在select也是赋值的作用。

    1. group_concat()
    复制代码

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

    1. FIND_IN_SET()
    复制代码
查询字段(strlist)中包含(str)的结果,返回结果为null或记录

三、具体实现

创建表

查询父级为 2 的下级  无限级查询
  1. 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
复制代码

列表化
  1. 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 的上级  无限级查询
  1. 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:

    1. PRIMARY
    复制代码
    :查询中最外层的SELECT(如两表做UNION或者存在子查询的外层的表操作为PRIMARY,内层的操作为UNION)
    1. DERIVED
    复制代码
    :被驱动的SELECT子查询(子查询位于FROM子句)
    1. UNCACHEABLE SUBQUERY
    复制代码
    :一个子查询的结果不能被缓存,必须重新评估外链接的第一行
Type:

    1. NULL
    复制代码
    : MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。
    1. index
    复制代码
    : Full Index Scan,index与ALL区别为index类型只遍历索引树
    1. System
    复制代码
    :system是const类型的特例,当查询的表只有一行的情况下,使用system

总结

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

来源:https://www.jb51.net/database/291845c8r.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具