V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
huiyanpohundh123
V2EX  ›  程序员

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

  •  
  •   huiyanpohundh123 ·
    tinuv · May 22, 2021 · 3337 views
    This topic created in 1807 days ago, the information mentioned may be changed or developed.

    发现公司代码库里面一个非常有水平(在我有限的见识里)的 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 replies    2021-05-23 10:04:11 +08:00
    zjsxwc
        1
    zjsxwc  
       May 22, 2021
    左右值编码树就能搞定的事儿,整这么复杂。
    F281M6Dh8DXpD1g2
        2
    F281M6Dh8DXpD1g2  
       May 22, 2021 via iPhone
    mysql 不支持 recursive cte,不得不写这种没啥可读性的查询
    takato
        3
    takato  
       May 22, 2021
    Adjacency List

    是很常用的数据结构
    xiangyuecn
        4
    xiangyuecn  
       May 22, 2021   ❤️ 1
    量小,select all,程序代码来处理层次

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


    结论:花里胡哨 无法移植 此 sql 几乎毫无意义😂
    bthulu
        5
    bthulu  
       May 22, 2021
    @liprais mysql 支持 recursive cte, 是你用的 mysql 太古董了
    paranoia
        6
    paranoia  
       May 22, 2021
    这。。。这不广度优先遍历与最短路径么,这用 sql 写出来有啥意义呢
    err1y
        7
    err1y  
       May 23, 2021 via iPhone
    如果可能的话路径查找使用图数据库感觉会更好一些
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2718 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 13:51 · PVG 21:51 · LAX 06:51 · JFK 09:51
    ♥ Do have faith in what you're doing.