V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
huiyanpohundh123
V2EX  ›  程序员

这个 SQL 有水平吗?巧妙利用 MySQL 用户变量查找层次数据库任意路径

  •  
  •   huiyanpohundh123 ·
    tinuv · 2021-05-22 09:08:57 +08:00 · 2943 次点击
    这是一个创建于 1289 天前的主题,其中的信息可能已经有所发展或是发生改变。

    发现公司代码库里面一个非常有水平(在我有限的见识里)的 SQL

    应用场景

    层次数据库,数据库结构类似于这种,也是层次数据常用的写法了

    create table t(
        id int primary key comment 'id',
        parent_id int comment 'parent_id'
    )
    

    目标是查找一个一个节点的全路径,例如
    id,parent_id
    1,0
    2,1
    3,1
    4,1
    5,2
    输入参数 5 能输出
    5
    2
    1

    SQL

    分享一下

    SELECT T2.id
    FROM (
             SELECT @r                                                AS _id,
                    (SELECT @r := parent_id FROM t WHERE id = _id) AS parent_id,
                    @l := @l + 1                                      AS lvl
             FROM (SELECT @r := 5, @l := 0) vars,
                  t h) T1
             JOIN t T2 ON T1._id = T2.id
    
    7 条回复    2021-05-23 10:04:11 +08:00
    zjsxwc
        1
    zjsxwc  
       2021-05-22 09:12:44 +08:00
    左右值编码树就能搞定的事儿,整这么复杂。
    liprais
        2
    liprais  
       2021-05-22 09:28:07 +08:00 via iPhone
    mysql 不支持 recursive cte,不得不写这种没啥可读性的查询
    takato
        3
    takato  
       2021-05-22 09:40:26 +08:00
    Adjacency List

    是很常用的数据结构
    xiangyuecn
        4
    xiangyuecn  
       2021-05-22 09:46:12 +08:00   ❤️ 1
    量小,select all,程序代码来处理层次

    量大,select 1 、select 2 、select n.... ,递归 n 次主键查询


    结论:花里胡哨 无法移植 此 sql 几乎毫无意义😂
    bthulu
        5
    bthulu  
       2021-05-22 10:29:28 +08:00
    @liprais mysql 支持 recursive cte, 是你用的 mysql 太古董了
    paranoia
        6
    paranoia  
       2021-05-22 11:12:50 +08:00
    这。。。这不广度优先遍历与最短路径么,这用 sql 写出来有啥意义呢
    err1y
        7
    err1y  
       2021-05-23 10:04:11 +08:00 via iPhone
    如果可能的话路径查找使用图数据库感觉会更好一些
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2619 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:35 · PVG 14:35 · LAX 22:35 · JFK 01:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.