2017-06-17 139 views
0

我有以下的列如何让所有的孩子记录在MYSQL分层数据

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,但是我很难找到孩子

+0

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

回答

1

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

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

我做了一个关于在MySQL的Percona的直播会议即将到来的递归查询功能演示在2017年4月: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

0

您必须检查有关Managing Hierarchical Data in MySQL

这是一个很好的文章,告诉您如何处理与“无限”深度hierarquical数据有很大的技术下面的文章。

注意的话语:如果你处理其中的孩子有一个独特的父hierarquical数据,这是你一个很好的解决方案。但是,如果你正在处理的有多个父,那么你处理图形和针对理儿,MySQL的它并不适合你。您必须探索解决方案为Neo4J而不是

相关问题