在我需要处理的事情中,在给定时间,我需要找到具有 0 个或 1 个子节点的树的所有节点(使用物化路径 + 相邻节点创建)。这些列类似于:
id int
parent_node int
treepath VARCHAR(255)
deepness int
当我试图提出解决方案时,我只能想到非常复杂的查询,这些查询会使用太多的子查询或表连接。
对于具有 0 个子节点的节点,我一直在考虑搜索 parent_id 未引用且位于子树内的所有节点。
SELECT *
FROM user_tree
WHERE
node_id NOT IN (
SELECT parent_id
FROM user_tree
WHERE parent_id IS NOT NULL
)
AND
treepath LIKE
(
SELECT CONCAT(treepath, '/%')
FROM user_tree
WHERE node_id = 4
)
使用 EXPLAIN,这对于数据库来说似乎有点痛苦,因为获取节点列表需要多长时间。
是否有一种非非常痛苦的方式(在性能方面)来进行查找我想要的查询?
编辑:
根据要求,这是表格的一些示例格式:
id parent_id treepath deepness
1 NULL 1 0
2 NULL 2 0
3 1 1/3 1
4 1 1/4 1
5 4 1/4/5 2
7 3 1/3/7 2
8 3 1/3/8 2
9 7 1/3/7/11 3