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

2021-05-22 09:08:57 +08:00
 huiyanpohundh123

发现公司代码库里面一个非常有水平(在我有限的见识里)的 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
2935 次点击
所在节点    程序员
7 条回复
zjsxwc
2021-05-22 09:12:44 +08:00
左右值编码树就能搞定的事儿,整这么复杂。
liprais
2021-05-22 09:28:07 +08:00
mysql 不支持 recursive cte,不得不写这种没啥可读性的查询
takato
2021-05-22 09:40:26 +08:00
Adjacency List

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

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


结论:花里胡哨 无法移植 此 sql 几乎毫无意义😂
bthulu
2021-05-22 10:29:28 +08:00
@liprais mysql 支持 recursive cte, 是你用的 mysql 太古董了
paranoia
2021-05-22 11:12:50 +08:00
这。。。这不广度优先遍历与最短路径么,这用 sql 写出来有啥意义呢
err1y
2021-05-23 10:04:11 +08:00
如果可能的话路径查找使用图数据库感觉会更好一些

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/778486

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX