发现公司代码库里面一个非常有水平(在我有限的见识里)的 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
分享一下
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
1
zjsxwc 2021-05-22 09:12:44 +08:00
左右值编码树就能搞定的事儿,整这么复杂。
|
2
liprais 2021-05-22 09:28:07 +08:00 via iPhone
mysql 不支持 recursive cte,不得不写这种没啥可读性的查询
|
3
takato 2021-05-22 09:40:26 +08:00
Adjacency List
是很常用的数据结构 |
4
xiangyuecn 2021-05-22 09:46:12 +08:00 1
量小,select all,程序代码来处理层次
量大,select 1 、select 2 、select n.... ,递归 n 次主键查询 结论:花里胡哨 无法移植 此 sql 几乎毫无意义😂 |
6
paranoia 2021-05-22 11:12:50 +08:00
这。。。这不广度优先遍历与最短路径么,这用 sql 写出来有啥意义呢
|
7
err1y 2021-05-23 10:04:11 +08:00 via iPhone
如果可能的话路径查找使用图数据库感觉会更好一些
|