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

19 浏览
0 Comments

如何在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/,但是我在获取子节点方面遇到了问题。

0
0 Comments

在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并不适合处理这种情况,需要考虑使用其他数据库解决方案。

0
0 Comments

如何在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》中的一章中讨论了这个问题。

0