使用JOIN按父ID获取所有子项

时间:2014-06-16 14:55:19

标签: mysql sql join mysql5 mysql-5.1

我有一张表示家谱的表。它包含字段IDNAMELEVELPARENT_ID

enter image description here

PARENT_ID是外键,并引用此表的列ID。如何获取所有列表(层次结构底部的任何级别)孩子只知道特定人员行的ID

sqlfiddle.com

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

例如,如果ID为7,则结果应为:

enter image description here

我使用的是MySQL-5.1。

编辑:如果原始问题没有解决方案,当最高级别等于5时可能有解决方案吗?

1 个答案:

答案 0 :(得分: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,循环继续,直到没有更多行为止。