从具有特定根的 SQL 表中获取最新分支的最有效方法是啥?

Posted

技术标签:

【中文标题】从具有特定根的 SQL 表中获取最新分支的最有效方法是啥?【英文标题】:What is the most efficient way to get the latest branch out of SQL table with specific root?从具有特定根的 SQL 表中获取最新分支的最有效方法是什么? 【发布时间】:2016-04-23 13:44:07 【问题描述】:

这是我的 mysql 数据库表中的内容:

id | parent | name
----------------------
1  | null   | Root 1
3  | null   | Root 3
6  | 3      | something 1
7  | 6      | something 2
9  | 1      | something 3

我想从表格中取出最近的分支。现在我只检查最高的id 并在代码中按照项目到根目录。

在我的情况下,我可以假设最新条目始终是分支的尖端,而不是分支或根的中间。

我遇到的问题是获取特定根的最新版本。所以假设我想要根3 的最新分支。我该怎么做?

有没有一种方法可以在 SQL 中查询此内容,而无需在 php 中进行递归循环,直到找到我需要的内容?

目前不能选择更改树在 SQL 中的存储方式。 :(

【问题讨论】:

***.com/questions/12796113/… 这可能会解决您的问题 不是,不是。根据您的建议,更改您的数据模型,或编写存储过程,或将表连接到自身,或使用应用程序级代码来处理递归。 【参考方案1】:

我建议添加一个包含指向该特定节点的完整路径的新列:

id | parent | name          | path 
-----------------------------------
1  | null   | Root 1        | 0|1
3  | null   | Root 3        | 0|3
6  | 3      | something 1   | 0|3|6
7  | 6      | something 2   | 0|3|6|7
9  | 1      | something 3   | 0|1|9

这不会改变您现有的数据,只会扩展它。这种方法在计算时间上比递归或存储过程更简单。当您需要分支 3 的最新版本时,您将执行此操作并直接获取最新节点:

SELECT id FROM table where path like "0|3%" 
ORDER BY path DESC LIMIT 1

【讨论】:

以上是关于从具有特定根的 SQL 表中获取最新分支的最有效方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询从数据库中的一个表中获取所有帖子,但来自特定用户的最多5个条目? [复制]

从具有特定值的表中获取列名

从状态更新表中有效获取具有给定状态的ID

从sql列中拆分数据并将其保存在sql存储过程中的另一个表中的最有效方法是啥[重复]

从 HMT 连接表中获取属性的最有效方法是啥?

BigQuery:仅当字段具有特定值时才获取表中的最新行