【问题标题】:hierarchical mysql query: up and down through parent/children分层mysql查询:通过父/子上下
【发布时间】:2021-03-02 01:57:16
【问题描述】:

我需要一个能够检索条目的所有父母和所有孩子(我不知道会有多少级别)的查询。 我已经使用了一段时间这个查询,但我现在意识到它不起作用:当我插入一个子 id 时,它不会检索父。

    SELECT id, title, parent FROM 
    (SELECT * FROM table1 ORDER BY id ASC) sorted, 
    (SELECT @pv := ?) initialisation WHERE (FIND_IN_SET(parent, @pv) OR id = @pv) AND length(@pv := CONCAT(@pv, ',', id)) 
    
    UNION 

    SELECT id, title, parent FROM 
    (SELECT * FROM table1 ORDER BY post_id ASC) sorted2, 
    (SELECT @pv2 := @pv) initialisation2 WHERE (FIND_IN_SET(post_id, @pv2) OR parent = @pv2) AND length(@pv2 := CONCAT(@pv2, ',', parent))

例子:

id   name     parent
4    red      0
20   brown    4
22   blu      20

如果我设置 ? = 4 它得到所有这些,但如果?设置为 20 它只有 20 和 22。 任何帮助,将不胜感激! 谢谢

[MySQL v 5.7]

【问题讨论】:

  • 什么是精确的 MySQL 版本?

标签: mysql recursion parent-child hierarchy mysql-5.7


【解决方案1】:

你没有提到 MySQL 的版本。

MySQL 8.0 实现了递归 CTE,您可以使用它来遍历树从任何节点到叶子。

例如:

with recursive
n as (
  select * from table1 where id = 20 -- starting node
 union all
  select t.*
  from n
  join table1 t on t.parent = n.id
)
select * from n;

结果:

 id  name  parent 
 --- ----- ------ 
 20  red   4      
 22  red   20

请参阅DB Fiddle 的运行示例。在此示例中,您可以将起始节点更改为 4 并获取所有行,或者更改为 22 并仅获取最后一行。

【讨论】:

  • 是的对不起,是MySQL 8.0之前的,所以我需要手动操作!
  • 另外,您的解决方案也不起作用,因为无论如何我都需要检索所有三个:所有父母(和他们自己的父母)和所有孩子(和他们自己的孩子)跨度>
猜你喜欢
  • 2020-12-27
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
相关资源
最近更新 更多