2010-05-06 82 views
4

具有分层结构的检索数据如下表在MySQL

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并非真正为分层值设计,但这是我需要做的。

干杯!

回答

12

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

有用于在MySQL处理分层数据的技术。

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

也有一些巧妙的技术来存储分层数据,因此可以对它们进行查询:

  • 路径枚举存储与每个节点的祖先的名单。例如,您的示例中的照片5将存储“0-2-4-5”。您可以通过搜索节点,其路径为“%”级联是5的一个LIKE谓词路径的火柴来寻找祖先。

  • 嵌套集合是乔·塞科在他的文章和他的著作推广一个复杂的,但聪明的技术“树木和层次在SQL为Smarties一。”有许多网上博客和文章也有关于它。查询树很容易,但很难查询直接的孩子或父母,很难插入或删除节点。

  • 关闭表涉及将每个祖先/后代关系存储在一个单独的表中。如果添加路径长度列,可以轻松查询树,便于插入和删除,并且便于查询直接父母或子女。

你可以看到在我的演讲Practical Object-Oriented Models in SQL或我即将出版的新书SQL Antipatterns: Avoiding the Pitfalls of Database Programming比较这些方法的详细信息。