技术解析

这个 SQL 有水平吗?巧妙利用 MySQL 用户变量查找层次数据库任意路径
0
2021-06-01 17:22:50
idczone

发现公司代码库里面一个非常有水平(在我有限的见识里)的 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 := par国外服务器ent_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

左右值编码树就能搞定的事儿,整这么复杂。

mysql 不支持 recursive cte,不得不写这种没啥可读性的查询

Adjacency List
是很常用的数据结构

量小,select all,程序代码来处理层次
量大,select 1 、select 2 、select n.... ,递归 n 次主键查询

结论:花里胡哨 无法移植 此 sql 几乎毫无意义
数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服