MySQL - 递归树结构

Ext*_*kun 9 mysql recursion hierarchy

我有一个数据库表,将位置链接在一起; 位置可以位于其他位置内的位置.

location (<id>, ....)
location_parent (<location_id>, <parent_id>)
Run Code Online (Sandbox Code Playgroud)

这是MySQL/PHP的深度:

$sql = "SELECT id FROM se_locations_services WHERE parent_locationid IN
( SELECT location_id FROM se_locations_parent WHERE parent_id = '$locationid' )";
Run Code Online (Sandbox Code Playgroud)

在给定父位置的情况下,如果使用MySQL,无论多深,都能获得所有后代位置?

Pek*_*ica 23

在mysql.com上有一篇很好看的文章,概述了管理分层数据的各种方法.我认为它为您的问题提供了完整的解决方案,并显示了各种不那么简单但更快的方法(例如嵌套集).

  • 你在这里链接的+1非常有趣的文章. (3认同)
  • 继续两年,在http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/上还有该文章的非返回加工版本.(基本上它已移至作者自己的博客) (3认同)
  • 这就是为什么答案应始终包含答案的完整详细信息,并引用来源,而不是作为答案的参考 (3认同)

小智 6

这是一个老问题,但因为我偶然发现了这个寻找解决方案。

从 MySQL 8.0 开始,您可以为此使用递归 CTE

WITH RECURSIVE tmp (id) AS
(
  SELECT id
    FROM locations
    WHERE parent_id IS NULL
  UNION ALL
  SELECT l.id
    FROM tmp AS p JOIN locations AS l
      ON p.id = l.parent_id
)
SELECT * FROM tmp
ORDER BY id;
Run Code Online (Sandbox Code Playgroud)

这假设与原始问题中的数据库结构略有不同(例如,只有一个包含父/子的表),但是,我确信这种技术也适用于那里。