MySQL - 递归树结构

时间:2010-03-04 11:02:58

标签: mysql recursion hierarchy

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

location (<id>, ....)
location_parent (<location_id>, <parent_id>)

这是MySQL / PHP的深度:

$sql = "SELECT id FROM se_locations_services WHERE parent_locationid IN
( SELECT location_id FROM se_locations_parent WHERE parent_id = '$locationid' )";

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

5 个答案:

答案 0 :(得分:23)

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

答案 1 :(得分:2)

这是一个古老的问题,但是由于我偶然发现了该解决方案。

从MySQL 8.0开始,您可以为此使用recursive 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;

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

答案 2 :(得分:1)

MySQL缺乏对分层函数的原生支持,因此您必须使用会话变量来模拟它们以保持递归状态。

请参阅本文,了解如何实现该功能:

答案 3 :(得分:0)

管理此类数据的一种更好的方法是使用Modified Preorder Tree Traversal技术:

http://articles.sitepoint.com/article/hierarchical-data-database/2

HTH

瓦特://

答案 4 :(得分:0)

由于mysql语句只能返回表结构数据,你如何想象返回的树结构?

可以使用[parent_id,child_id]表进行选择,但它需要临时表,我已经看到它在DB2上完成,而不是在MySQL上完成。

查看本文以了解存储在MySQL中的树状结构:http://articles.sitepoint.com/article/hierarchical-data-database/