【问题标题】:Is there a more efficient way to loop through this sql result set?有没有更有效的方法来循环这个 sql 结果集?
【发布时间】:2013-02-21 02:57:52
【问题描述】:

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

pk int:cat_id
诠释:父ID
varchar: cat_name

顶级类别的 parent_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;
}

除了嵌套循环和数据库查询之外,还有更有效的方法吗?

感谢您的任何意见。

【问题讨论】:

  • en.wikipedia.org/wiki/Join_(SQL) 通常,任何基于父查询结果的嵌套查询都可以/应该重写为连接。
  • 我尝试自行加入表,你能给我举个例子说明如何编写这个 n 级连接吗?
  • @user2027914:您的分类表有多大?如果大约有数百个 - 以select * from category 的形式获取所有内容并在 php 端构建树怎么样?
  • 不用为每个 parent_id 查询 db,您可以从结果中获取父 id 的列表,并使用cat_id IN (parent_ids) 来减少数据库调用的次数。对于您在 php 中迭代的每个结果并根据需要使用它们。
  • @zerkms:我当然可以获取所有内容并构建一棵树并在服务器端代码中遍历它,如果我坚持使用这种表结构,这可能是消除众多嵌套数据库的最佳方法之一来电。

标签: mysql sql


【解决方案1】:

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

如果您正在认真寻找此特定查询的效率,请将您的层次结构存储为嵌套集。请注意,这是一项重要的工作,并且会增加维护数据的成本。它还会降低其他查询的效率,例如寻找孩子。

本网站和其他网站上有大量关于在 RDMS 中存储分层数据的信息。

【讨论】:

  • “如果您正在认真寻找效率,那么将您的层次结构存储为嵌套集”——这不是真的。 “邻接表很少是最好的方法。” --- 这也不是真的。
  • 感谢您的回复。邻接列表与嵌套集似乎正是我需要在这里查看的内容。我发现这个链接是对两者的一个非常有用的比较:Manage Hierarchical Data In MySQL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
相关资源
最近更新 更多