从MySql数据库中检索分层数据

时间:2016-08-02 08:31:53

标签: mysql sql algorithm tree

这是我的Mysql数据库

╔════╦═══════════╗
║ ID ║ Parent_ID ║
╠════╬═══════════╣
║  1 ║         0 ║
╠════╬═══════════╣
║  2 ║         1 ║
╠════╬═══════════╣
║  3 ║         1 ║
╠════╬═══════════╣
║  4 ║         3 ║
╠════╬═══════════╣
║  5 ║         4 ║
╚════╩═══════════╝

我想要实现的目标:

当用户搜索 ID 1 时,我希望获取 Parent_ID 为1的所有元素以及 1 <的所有ID / em>作为他们的父母或祖父母或曾祖父母等等。

或者只是ID 1的所有后代。

示例:

  1. 如果用户搜索1,算法应给出结果
        {2,3,4,5} - 4,5因为1是他们的曾祖父母。

  2. 如果用户搜索2,则算法应将空结果{}视为否 element有2作为Parent_ID

  3. 如果用户搜索3,算法应该给出结果{4,5} - 5因为3是它的祖母。

  4. 从数据库保存和检索这些类型数据的好方法是什么?

    我正在使用Java和MySQL

    感谢。

1 个答案:

答案 0 :(得分:1)

查看您的数据模型,您无法在单个SQL查询中执行此操作,因为您需要未知级别的递归。您需要创建一个函数或存储过程来迭代后续查询的结果。

这个答案可能对您有所帮助: https://dba.stackexchange.com/questions/30021/mysql-tree-hierarchical-query

<强> [编辑]

如果您始终查询根父级(即可能包含子级但没有父级的行),则可以在每行中存储该ID并按该列进行查询:

╔════╦═══════════╦════════════════╗
║ ID ║ Parent_ID ║ Root_Parent_ID ║
╠════╬═══════════╬════════════════╣
║  1 ║         0 ║              1 ║
╠════╬═══════════╬════════════════╣
║  2 ║         1 ║              1 ║
╠════╬═══════════╬════════════════╣
║  3 ║         1 ║              1 ║
╠════╬═══════════╬════════════════╣
║  4 ║         3 ║              1 ║
╠════╬═══════════╬════════════════╣
║  5 ║         4 ║              1 ║
╠════╬═══════════╬════════════════╣
║  6 ║         0 ║              6 ║
╠════╬═══════════╬════════════════╣
║  7 ║         6 ║              6 ║
╠════╬═══════════╬════════════════╣
║  8 ║         7 ║              6 ║
╚════╩═══════════╩════════════════╝

然后你可以查询: SELECT * FROM mytable WHERE Root_Parent_ID = 1

否则,我建议您更深入地了解如何更有效地存储这些数据:https://blogs.msdn.microsoft.com/anthonybloesch/2006/02/15/hierarchies-trees-in-sql-server-2005/