如何在MYSQL分层数据中获取所有子记录
如何在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层深。我在这个链接中找到了一个很好的解决方案,用于获取父id:https://explainextended.com/2009/07/20/hierarchical-data-in-mysql-parents-and-children-in-one-query/,但是我在获取子节点方面遇到了问题。
在MySQL中处理分层数据有一个很好的技术,可以查看以下关于《在MySQL中管理分层数据》的文章。但是需要注意:如果你正在处理子节点有唯一父节点的分层数据,这是一个很好的解决方案。但是如果你正在处理子节点有多个父节点的情况,那么你正在处理图形数据,MySQL不适合你,你需要考虑使用Neo4J等其他解决方案。
解决方法如下:
首先,你需要创建一个包含ID和ParentID字段的表来表示分层数据。然后,你可以使用递归查询来获取所有子记录。
以下是一个示例的MySQL查询代码:
SELECT * FROM your_table WHERE ParentID = 'your_parent_id' UNION ALL SELECT t.* FROM your_table t INNER JOIN (SELECT * FROM your_table) AS child_table ON t.ParentID = child_table.ID
这个查询将返回指定父ID的所有子记录。
通过递归查询,可以获取所有子记录,无论分层数据的深度有多大。这是处理分层数据的一种常见方法。
然而,需要注意的是,如果你处理的是具有多个父节点的分层数据,MySQL并不适合处理这种情况。在这种情况下,你应该考虑使用其他数据库解决方案,如Neo4J。
总结起来,处理分层数据可以使用递归查询来获取所有子记录。但是当子节点具有多个父节点时,MySQL并不适合处理这种情况,需要考虑使用其他数据库解决方案。
如何在MYSQL分层数据中获取所有子记录
问题的出现原因:
MySQL 8.0.1之前的版本不支持使用CTE语法编写递归SQL查询。
解决方法:
1. 使用CTE语法编写递归SQL查询。这是最好的解决方案,但需要MySQL 8.0.1或更高版本的支持。
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;
2. 如果无法使用MySQL 8.0.1或更高版本,可以使用ExplainExtended提供的巧妙解决方案,或者将分层数据存储在其他方式中以支持非递归查询。
其他解决方案:
1. 在2017年4月的Percona Live Conference上,我做了一个关于MySQL即将推出的递归查询功能的演示,详见:Recursive Query Throwdown in MySQL 8。
2. 在我的演示《Models for hierarchical data》或我在Stack Overflow上的回答中,我展示了一些解决方案。
3. 我还在我所写的书《SQL Antipatterns Volume 1: Avoiding the Pitfalls of Database Programming》中的一章中讨论了这个问题。