【问题标题】:Retrieving data with a hierarchical structure in MySQL在 MySQL 中检索具有层次结构的数据
【发布时间】:2010-05-06 16:02:17
【问题描述】:

给定下表

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       

我想做以下事情:

如果我搜索 Ben,我想找到图像,如果没有图像,我想找到父母的图像,如果不存在,我想去祖父母的图像......直到我们点击默认图像。

最有效的方法是什么?我知道 SQL 并不是真正为分层值设计的,但这是我需要做的。

干杯!

【问题讨论】:

    标签: mysql hierarchical-data


    【解决方案1】:

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

    在 MySQL 中有几种处理分层数据的技术。

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

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

    • 路径枚举 存储每个节点的祖先列表。例如,您示例中的照片 5 将存储“0-2-4-5”。您可以通过搜索其路径与“%”连接的节点与带有 LIKE 谓词的 5 的路径匹配来搜索祖先。

    • 嵌套集是一种复杂但巧妙的技术,由 Joe Celko 在他的文章和他的书“聪明人的 SQL 中的树和层次结构”中推广。也有许多关于它的在线博客和文章。查询树很容易,但很难查询直接的子节点或父节点,并且很难插入或删除节点。

    • 关闭表涉及将每个祖先/后代关系存储在单独的表中。如果添加 pathlength 列,则查询树很容易,插入和删除也很容易,并且很容易查询直接的父母或孩子。

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

    【讨论】:

      【解决方案2】:

      【讨论】:

        猜你喜欢
        • 2011-05-26
        • 1970-01-01
        • 2015-11-05
        • 1970-01-01
        • 1970-01-01
        • 2022-08-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多