mysql - 查找具有 0 或 1 个子树的子树中的所有节点

标签 mysql sql

在我需要处理的事情中,在给定的时间,我需要找到树的所有节点(使用物化路径 + 相邻节点制作)有 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,从获取节点列表所需的时间来看,这对于 DB 来说似乎有点痛苦。

是否有一种非非常痛苦的方式(在性能方面)来进行查询以找到我想要的内容?

编辑:
根据要求,这里是表格的一些示例格式:

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

最佳答案

没有样本数据,这只是一个猜测:

SELECT t1.*, t2.numchildren
FROM user_tree t1
LEFT JOIN ( SELECT parent_id, COUNT(*) AS numchildren
            FROM user_tree
            GROUP BY parent_id ) t2
ON t1.id = t2.parent_id
WHERE t2.numchildren IS NULL
OR t2.numchildren = 1;

SQL-Fiddle from sample data

关于mysql - 查找具有 0 或 1 个子树的子树中的所有节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18683698/

相关文章:

sql - 平均股票历史表

c# - 我如何告诉 Dapper 在使用 "WHERE"的 "IN"子句中使用 varchar 作为参数列表?

sql - 如何在 MySQL 中进行连续分组?

mysql,需要用随机日期更新列

php - Laravel 5.6 Eloquent ORM where 连接表

mysql - 将 Liferay 从 Oracle 迁移到 MySQL 时应该考虑什么?

mysql - VB.Net 中 Mysql 中插入查询的语法错误

SQL 服务器 : find duplicates in a table based on values in a single column

sql - 我应该在数据库连接字符串中设置最大池大小吗?如果我不这样做会怎样?

sql - 从SQL中的字符串中删除指定的字符