【问题标题】:Retrieve Hierarchical Data from MySql database [duplicate]从MySql数据库中检索分层数据[重复]
【发布时间】:2016-08-02 08:31:53
【问题描述】:

这是我的 Mysql 数据库

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

我想要达到的目标:

当用户搜索 ID 1 时,我想获取所有 Parent_ID 为 1 的元素以及所有具有 1 作为他们的父母或祖父母或曾祖父母等等。

或只是 ID 1 的所有后代。

示例:

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

  2. 如果用户搜索 2,算法应该给出空结果 { } 为 no 元素有 2 作为 Parent_ID

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

从数据库中保存和检索这类数据的好方法是什么?

我正在使用 Java 和 MySQL

谢谢。

【问题讨论】:

  • 这个问题目前的形式有点太宽泛了。我推荐阅读:mikehillyer.com/articles/managing-hierarchical-data-in-mysql
  • @DavidWallace ... 或者 4。
  • @DavidWallace OP 不知道它必须是递归的,因此问题
  • @DavidWallace 5 出现是因为 1 是 5 的曾祖父母,即 (1->2,3)、(3->4)、(4->5)。因此 1 是 5 的曾祖父母。
  • @PCP 如果您总是查询根父级,则将其存储在另一列(例如:Root_Parent_Id)中,您可以通过单个查询获取所有行。您还可以查看此链接以更深入地了解:blogs.msdn.microsoft.com/anthonybloesch/2006/02/15/…

标签: mysql sql algorithm tree


【解决方案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/

【讨论】:

  • 感谢您抽出宝贵时间回答问题。
  • 在sql表插入数据的时候,我只有两个信息ID和Parent_ID。那么您是否建议,我创建一个 Root_Parent_ID 列并在创建每一行时插入 Root_Parent_ID。
  • 以及如何获取元素的后代让我们说 ID = 3。即 {4,5} 为 {3->4, 4->5}。在获取 3 的后代列表时,我不想要其父母、祖父母的列表。
  • 对于每一行,设置 root_parent_id 等于其父 root_parent_id
猜你喜欢
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 2013-03-24
  • 1970-01-01
  • 2012-10-04
相关资源
最近更新 更多