Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中使用分层结构检索数据_Mysql_Hierarchical Data - Fatal编程技术网

在MySQL中使用分层结构检索数据

在MySQL中使用分层结构检索数据,mysql,hierarchical-data,Mysql,Hierarchical Data,给出下表 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,我想找到图像,如

给出下表

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缺少递归查询,这是标准SQL的一部分。许多其他品牌的数据库支持此功能,包括PostgreSQL(请参阅)

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

  • 最简单的方法是添加一列来记录给定照片所属的层次结构。然后,您可以搜索属于同一层次结构的照片,将它们全部返回到应用程序中,并找出您需要的照片。这在带宽方面有点浪费,需要编写更多的应用程序代码,如果树中有很多节点,这就不好了
还有一些聪明的技术可以存储分层数据,以便您可以查询它们:

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

  • 嵌套集是一种复杂但聪明的技术,Joe Celko在他的文章和他的书《Smarties的SQL中的树和层次结构》中推广了这一技术。关于它的在线博客和文章也很多。查询树很容易,但很难查询直接的子节点或父节点,也很难插入或删除节点

  • 闭包表涉及将每个祖先/后代关系存储在单独的表中。如果添加pathlength列,则可以轻松查询树、插入和删除,以及查询直接父级或子级

在我的演示文稿或即将出版的书中,您可以看到比较这些方法的更多信息