【问题标题】:Find all parents sql query with in a single table? [closed]在单个表中查找所有父 sql 查询? [关闭]
【发布时间】:2017-07-28 06:52:17
【问题描述】:

我有一张桌子:

Id | child | parent 
 1      67         0 
 2      69        67 
 3      79        68 
 4      76        69 
 7      75        68

我想选择记录直到父 ID 为零

同一张表中的所有记录

【问题讨论】:

  • 请提供输出示例和您尝试过的代码。
  • select * from table_1 c,table_1 where c.ID=P.Parent and c.Parent !=0
  • 它是一棵树吗?请解释属性的语义。您的数据的输出示例会很有用。
  • 是的,它是树,但是我的查询不起作用我是 sql 新手

标签: php mysql sql recursive-query


【解决方案1】:

引用How to represent a data tree in sql

某些数据库,尤其是 MySQL,在处理这种模型时存在一些问题,因为它需要能够运行 MySQL 所缺乏的递归查询。

可以在此处找到对问题(及其解决方案)的冗长但非常彻底的解释:Managing hierarchical data in mysql

TL/DR:如果您想通过单个查询来解决这个问题,那么您需要将树更改为嵌套列表结构 - 这有点难以理解,但在 mysql 中处理更有效。

让我们来看看这棵树:

  • 一个
    • B
    • C
      • D
      • E
    • F

在您的邻接列表格式中,这看起来像这样

id | text | parent
1    A
2    B      1
3    C      1
4    D      3
5    E      3
6    F      1

获取节点 D 的所有父节点并不容易。

现在我们将其转换为嵌套集:

0_________________A__________________11
  1_B_2   3_______C_______8   9_F_10
            4_D_5   6_E_7

id | text | lft | rgt
1    A      0     11
2    B      1     2
3    C      3     8
4    D      4     5
5    E      6     7
6    F      9     10

现在获取节点 D 的所有父节点很容易:

SELECT p.* FROM nestedset p
INNER JOIN nestedset o ON o.lft > p.lft AND o.rgt < p.rgt
WHERE o.text == "D"

至于如何进行其他操作,请按照我发布的链接进行操作。

【讨论】:

  • 嗯,这是一种解决方案
  • 感谢您的回复但我想要孩子的祖先和从孩子 id 到顶级父母的路径
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 2014-07-16
相关资源
最近更新 更多