在MySQL中检索具有分层结构的数据

oxf4rvwz  于 2022-10-22  发布在  Mysql
关注(0)|答案(2)|浏览(107)

给出下表

id    parentID   name      image
0     0                    default.jpg
1     0          Jason   
2     1          Beth      b.jpg
3     0          Layla     l.jpg
4     2          Hal     
5     4          Ben

我想做以下事情:
如果我搜索本,我想找到图像,如果没有图像,我想查找父母的图像,如果不存在,我想转到祖父母的图像…直到我们找到默认图像。
最有效的方法是什么?我知道SQL并不是为分层值而设计的,但这正是我需要做的。
干杯

nwsw7zdq

nwsw7zdq1#

MySQL缺少递归查询,这是标准SQL的一部分。许多其他品牌的数据库都支持此功能,包括PostgreSQL(请参阅http://www.postgresql.org/docs/8.4/static/queries-with.html)。
MySQL中有几种处理分层数据的技术。

  • 最简单的方法是添加一个列来记录给定照片所属的层次结构。然后,您可以搜索属于同一层次结构的照片,将它们全部返回到您的应用程序,并找出需要的照片。这在带宽方面有点浪费,需要您编写更多的应用程序代码,如果您的树有很多节点,这是不好的。

还有一些聪明的技术可以存储分层数据,以便您可以查询它们:

*路径枚举存储每个节点的祖先列表。例如,示例中的照片5将存储“0-2-4-5”。您可以通过搜索路径与“%”连接的节点来搜索祖先,该节点的路径与LIKE predicate 的路径匹配。
嵌套集是一种复杂但聪明的技术,由Joe Celko在他的文章和他的书《Smarties的SQL中的树和层次结构》中推广。网上也有很多关于它的博客和文章。查询树很容易,但很难查询直接的子级或父级,也很难插入或删除节点。
闭包表涉及将每个祖先/后代关系存储在一个单独的表中。查询树很容易,插入和删除也很容易,如果添加pathlength
列,查询直接父级或子级也很容易。

您可以在我的演示文稿Practical Object-Oriented Models in SQL或我即将出版的书SQL Antipatterns Volume 1: Avoiding the Pitfalls of Database Programming中看到比较这些方法的更多信息。

相关问题