mysql - 当您认识 parent 时如何搜索特定的 child ?

标签 mysql sql database tree nested-sets

我有一个标准的嵌套集模型,每个节点都有 ID、名称、所有者、lft 和 rgt 属性。给定输入的路径,例如:

//components/core/build/src/

我要搜索该文件

src

有一个名为

的父级

build

这是树的样子

   components
       |      
     core   
       |      
    build   
     /  \  
 src     1.0
          |
         src

如何使用 mySQL 查询特定父级的特定 src?

这是我现在的查询:

SELECT parent.file_id, parent.owner, parent.name 
FROM file_category AS node, file_category AS parent 
WHERE node.lft BETWEEN parent.lft AND parent.rgt 
AND node.name = 'src'

这会返回接近我想要的结果。如果树没有重复项,它就会起作用。

它返回树中每个节点的属性,直到到达 src。然而,由于有两个“src”节点,它会返回它们的共同祖先两次,然后分支并返回每个“src”的不同祖先的属性。

所以返回的表如下所示:

owner   name
dez     components
dez     components
sam     core
sam     core
tom     build
tom     build
mai     src
jim     1.0
bob     src

它将返回它们的共同祖先两次。

我想尝试一下:

SELECT parent.file_id, parent.owner, parent.name
FROM file_category AS node, file_category AS parent 
WHERE node.lft BETWEEN parent.lft AND parent.rgt 
AND node.name = 'src' AND parent.name = 'build' 

但这会返回一个包含两个构建行的表。也许是因为他们都有共同的建筑祖先?

我也尝试了这个,但得到了与上面查询相同的结果:

SELECT parent.file_id, parent.owner, parent.name
FROM file_category AS node, file_category AS parent 
WHERE node.lft BETWEEN parent.lft AND parent.rgt 
AND node.name = 'src' AND parent.name = 'build' AND parent.lft = 3

另外,我看了这个question这与我的问题非常接近,但是提供的答案不起作用。

我是 SQL 新手,非常感谢任何帮助。

最佳答案

我不确定,但根据我对您的架构的理解,这是我的解决方案

SELECT parent.file_id, parent.owner, parent.name
FROM file_category AS node, file_category AS parent 
WHERE (node.file_id = parent.lft OR node.file_id = parent.rgt) 
AND node.name = 'src';

关于mysql - 当您认识 parent 时如何搜索特定的 child ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31419101/

相关文章:

sql - 在 T-SQL 中,当另一行 <> 'X' 时检索最新日期的一行数据

php - 在提交到 MySQL 数据库之前清理文本输入

php 更新--- T_CONSTANT_ENCAPSED_STRING 错误

PHP MySQL 准备好的语句 : Execute dies, 既不返回 true 也不返回 false

php - Last_insert_id 的效率如何?

php - 在少数情况下拆分文本 (PHP)

mysql - SQLite - 从表中检索名称集

mysql - 在 MYSQL 中声明外键时出现语法错误(使用 innoDB)

mysql - 加入双录

sql - mysql group by返回一个min值并得到对应的行数据