Mysql 是否有一种更有效的方法循环使用此sql结果集?

Mysql 是否有一种更有效的方法循环使用此sql结果集?,mysql,sql,Mysql,Sql,因此,我在数据库中有一个表,其中包含如下结构的类别: pk int:cat_id int:parent\u id 瓦查尔:猫的名字 顶级类别的父级id为空,并且可以有多个级别的子级。 基本上,我获取一个搜索字符串并将其与类别名称进行匹配,如果类别有父类别,那么我希望以面包屑方式显示所有匹配的完整路径。下面是我现在所做工作的伪代码: search_string = whatever; result = query db and find all category names matching "%

因此,我在数据库中有一个表,其中包含如下结构的类别:

pk int:cat_id int:parent\u id 瓦查尔:猫的名字

顶级类别的父级id为空,并且可以有多个级别的子级。 基本上,我获取一个搜索字符串并将其与类别名称进行匹配,如果类别有父类别,那么我希望以面包屑方式显示所有匹配的完整路径。下面是我现在所做工作的伪代码:

search_string = whatever;
result = query db and find all category names matching "%whatever%";
foreach(result)
{
    parent_id = result[parent_id];
    result_path = result[cat_name];
    while(parent_id != null)
    {
        result2 = query db and find cat_id = parent_id;
        result_path = result2[cat_name] + " > " + result[path];
        parent_id = result2[parent_id];
    }
    print result_path;
}
除了嵌套循环和数据库查询之外,还有其他更有效的方法吗


感谢您的输入。

您拥有的是存储为邻接列表的层次结构。在MySql或PHP中,递归是解决此问题的唯一实用方法


如果您认真地寻找这个特定查询的效率,那么将层次结构存储为嵌套集。请注意,这是一项非常重要的工作,会增加维护数据的成本。它还将降低其他查询(如查找子项)的效率


在这个站点和其他站点上有大量关于在RDMS中存储分层数据的信息

一般来说,任何基于父查询结果的嵌套查询都可以/应该被重写为联接。我尝试将表本身联接起来,您能给我一个如何编写此n级联接的示例吗?@user2027914:您的带有类别的表有多大?如果大约有数百个-从类别中获取所有内容作为select*并在php端构建树如何?您可以从结果中获取父id列表,并在父id中使用cat_id来减少数据库调用的数量,而不是查询每个父id的db。对于您在php中迭代的每个结果,并根据需要使用它们。@zerkms:我当然可以获取所有内容并构建一棵树,然后在服务器端代码中遍历它,如果我坚持使用这种表结构,这可能是消除大量嵌套db调用的最佳方法之一。如果您认真地寻找效率,那么将层次结构存储为嵌套集是不正确的。邻接列表很少是最好的方法。-也不是这样。谢谢你的回复。邻接列表和嵌套集似乎正是我需要在这里看到的。我发现这个链接对比较这两个方面很有帮助: