【问题标题】:Get all childs by parent id using JOIN使用 JOIN 按父 ID 获取所有子代
【发布时间】:2014-08-06 10:40:09
【问题描述】:

我有一张代表家谱的表格。它有字段ID、NAME、LEVEL、PARENT_ID。

而PARENT_ID 列是外键,引用此表的ID 列。我怎样才能得到一个all(层次结构底部的任何级别)children的列表,只知道特定人行的ID?

sqlfiddle.com

我需要在不使用存储过程调用的情况下在单个查询中获取它。请帮助把它做得最好。

例如,如果ID 是 7,那么结果应该是:

我使用 MySQL-5.1。

编辑:如果原来的问题没有解决,也许当最高等级等于5时有解决方案?

【问题讨论】:

  • 我不认为你可以。由于到底部的层数不定,所以没有一条 SQL 语句可以一直走到底部。
  • 我不需要使用PHP,我需要SQL
  • mysql 不支持递归查询。您可以进行 n 路自我连接以恢复“升级”n 个级别,但这不是通用解决方案。通常的解决方法是在循环中执行查询并按照自己的方式进行备份。
  • 如果原来的问题没有解决,也许最高等级等于5时有解决方案?

标签: mysql sql join mysql5 mysql-5.1


【解决方案1】:

编辑:不是一个完整的解决方案。执行技巧只遵循多个分支之一,并且无法交付多个孙分支。根据评论。在 SQLFiddle 上的结果中也可以看到。

因此,SQLFiddle 的解决方案说明了 MySQL 中可以利用的一个有趣的执行黑客。

SELECT 
  @parent_id := id AS id,
  parent_id,
  name,
  level,
  @depth := @depth + 1 AS depth
FROM 
  family_tree t
  join (SELECT @parent_id := 7, @depth := 0) f
WHERE id = @parent_id or parent_id = @parent_id ;

基本上,将您的 @parent_id 变量声明为您开始的根。连接子查询只执行一次。然后,当每一行重新定义@parent_id 时,where 子句被重新计算,并返回一个新行,它重新定义了@parent_id,循环继续,直到没有更多行为止。

【讨论】:

  • 所以这不是一个完整的解决方案。它只会给你树的一部分......如果有多个孙子,他们将被排除在树之外。很好的查询,几个月前我做了类似的事情:)
  • 嗯,确实如此。我正在尝试将我的 TSQL 转换为 MySQL,看起来我偶尔会出差错。感谢您指出这一点。
  • No prob :) 我认为解决此问题的最佳方法是创建一个用户定义的变量,其中包含一个您可以比较的 id 列表......这就是我之前所做的制作一棵完整的树:)
  • 我很想看看您的解决方案,如果您愿意发布答案或链接?我在 MySQL 中有一个递归的自我关系项目,这对我非常有帮助。
猜你喜欢
  • 2015-08-12
  • 1970-01-01
  • 2016-01-19
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
相关资源
最近更新 更多