如何在MYSQL分层数据中获取所有子记录

时间:2017-06-17 12:21:49

标签: mysql hierarchical-data hierarchical

我有一个包含以下列的表

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/,但我在生孩子方面遇到了麻烦

2 个答案:

答案 0 :(得分:2)

最好的解决方案是#34;使用CTE语法编写递归SQL查询"但是在MySQL 8.0.1之前不支持。

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

我在2017年4月的Percona Live大会上做了关于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中写了一章。

答案 1 :(得分:0)

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

的文章

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

谨慎之词:如果您正在处理儿童拥有独特父母的分层数据,那么这对您来说是一个很好的解决方案。但是,如果你正在处理拥有多个父母的孩子,那么你正在处理图表,因此 MySQL不适合你。您必须以[{3}}而不是来探索解决方案。