【问题标题】:How to get all children records in MYSQL hierarchical data [duplicate]如何获取MYSQL分层数据中的所有子记录[重复]
【发布时间】:2017-11-20 03:16:52
【问题描述】:

我有一个包含以下列的表格

id   |    parent_customer_id
-----------------------------
1    |    0
2    |    0
3    |    1
4    |    2
5    |    4
6    |    4

我想要一个可以返回某个客户的所有子 ID 的脚本。例如

get_child_ids (1) = 1,3
get_child_ids(2) = 2,4,5,6
get_child_ids(3) = 3
get_child_ids(4) = 4,5,6
get_child_ids(5) = 5
get_child_ids(6) = 6

有些 id 的深度可以达到 10 级。我在https://explainextended.com/2009/07/20/hierarchical-data-in-mysql-parents-and-children-in-one-query/ 找到了获取父 ID 的绝佳解决方案,但我无法获取孩子

【问题讨论】:

  • 什么麻烦? id 的数据与您共享的示例数据中的其他 id 不同。

标签: mysql hierarchical-data hierarchical


【解决方案1】:

最好的解决方案是“使用 CTE 语法编写递归 SQL 查询”,但直到 MySQL 8.0.1 才支持。

递归 CTE 语法是标准 SQL,所有流行品牌的 SQL 兼容产品都支持它,现在 MySQL 支持它。

我在 2017 年 4 月的 Percona Live Conference 上介绍了 MySQL 中即将推出的递归查询功能:Recursive Query Throwdown in MySQL 8

WITH RECURSIVE MyCTE AS (
  SELECT id, parent_customer_id FROM MyTable WHERE id = ?
  UNION
  SELECT id, parent_customer_id FROM MyTable JOIN MyCTE 
    ON MyTable.parent_customer_id = MyCTE.id
)
SELECT * FROM MyCTE;

如果您不能使用 MySQL 8.0.1 或更高版本,您可以使用 ExplainExtended 中的巧妙解决方案,或者您可以以其他方式存储分层数据以支持非递归查询。

我在我的演示文稿Models for hierarchical data 或我对What is the most efficient/elegant way to parse a flat table into a tree? 的回答中展示了一些解决方案。

我还在我的书SQL Antipatterns: Avoiding the Pitfalls of Database Programming中写了一个章节。

【讨论】:

    【解决方案2】:

    您必须查看以下关于Managing Hierarchical Data in MySQL

    的文章

    这是一篇出色的文章,向您展示了如何处理具有“无限”深度的分层数据的绝妙技术。

    注意事项:如果您正在处理孩子有唯一父母的分层数据,那么这对您来说是一个很好的解决方案。但是,如果您正在处理具有多个父级的子代,那么您正在处理的是图表,因此,MySQL 不适合您。您必须改为以Neo4J 的身份探索解决方案

    【讨论】:

      猜你喜欢
      • 2021-12-29
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      • 2018-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多