从具有特定根的 SQL table 中获取最新分支的最有效方法是什么?
What is the most efficient way to get the latest branch out of SQL table with specific root?
这是我的 MySQL 数据库 table:
id | parent | name
----------------------
1 | null | Root 1
3 | null | Root 3
6 | 3 | something 1
7 | 6 | something 2
9 | 1 | something 3
我想从 table 中获取最新的分支。现在我只检查最高的 id
并在代码中跟随这些项目到根目录。
在我的例子中,我可以假设最新条目始终是分支的尖端,而不是分支或根的中间。
我遇到的问题是获取特定根目录的最新版本。所以假设我想要 root 3
的最新分支。我该怎么做?
有没有一种方法可以在 SQL 中进行查询,而不必在 PHP 中进行递归循环,直到找到我需要的内容?
改变树在 SQL 中的存储方式目前不是一个选项。 :(
我建议添加一个包含该特定节点完整路径的新列:
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
这是我的 MySQL 数据库 table:
id | parent | name
----------------------
1 | null | Root 1
3 | null | Root 3
6 | 3 | something 1
7 | 6 | something 2
9 | 1 | something 3
我想从 table 中获取最新的分支。现在我只检查最高的 id
并在代码中跟随这些项目到根目录。
在我的例子中,我可以假设最新条目始终是分支的尖端,而不是分支或根的中间。
我遇到的问题是获取特定根目录的最新版本。所以假设我想要 root 3
的最新分支。我该怎么做?
有没有一种方法可以在 SQL 中进行查询,而不必在 PHP 中进行递归循环,直到找到我需要的内容?
改变树在 SQL 中的存储方式目前不是一个选项。 :(
我建议添加一个包含该特定节点完整路径的新列:
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