【问题标题】:How to iterate over joined data in two or more nested loops?如何在两个或多个嵌套循环中迭代连接数据?
【发布时间】:2009-04-22 20:52:27
【问题描述】:

前段时间我在 SO 上问过a question about nested loops,事实上,在我的示例的循环中存在查询,我得到了明确的答案:

永远不要将 SQL 查询放入循环中

从那以后我一直在尝试,而且大部分都有效。只需要努力并编写一个查询,一次检索您需要的所有内容。

但是,当您有一个来自 JOIN 查询的数据集,其中包含您需要以嵌套方式输出的嵌套数据时,您会怎么做?

表 A 和 B 的连接示例:

A.a     |  B.a     |  B.b
--------|----------|-------------
fruits  |  banana  |  yellow
fruits  |  apple   |  red
animals |  zebra   |  black&white
animals |  elefant |  gray
animals |  fox     |  red
planets |  earth   |  blue
planets |  mars    |  red

好的,现在我将所有内容放在一个数组或行集中,现在我需要显示类似的内容:

水果

  • 黄香蕉
  • 红苹果

动物

  • 黑白斑马
  • 灰象
  • 红狐

行星

  • 蓝色地球
  • 红色火星

它似乎很明显应该可以工作,但我现在已经尝试过好几次了,但我就是想不出一个解决方案。

目前我以我的老方式做事:

查询组

foreach 组
{
    查询组中的动物
    动物
}

但是,嘿,永远不要将 sql 放入循环中。那我该怎么办?我做 PHP 但我认为这是一个元问题。

【问题讨论】:

    标签: join loops nested-loops


    【解决方案1】:

    使用控制中断算法。

    我会返回一个与您在问题中显示的完全一样的结果集:

    A.a     |  B.a     |  B.b
    --------|----------|-------------
    fruits  |  banana  |  yellow
    fruits  |  apple   |  red
    animals |  zebra   |  black&white
    animals |  elefant |  gray
    animals |  fox     |  red
    planets |  earth   |  blue
    planets |  mars    |  red
    

    遍历所有行:

    • 当A.a发生变化时,输出标题
    • 然后总是输出 B.b + B.a 值

    应用调用SQL的伪代码:

    set last_A = null
    exec query
    
    loop over result set {
        if last_A == null or fetch_A!=last_A {
            last_A=fetch_A
            display fetch_a
        }
        display fetch_Bb + fetch_Ba
        }
    }//loop
    

    【讨论】:

    • 好吧,我想过这样的事情,但我又一次陷入困境。我再试一次。
    • 它绝对有效!不得不考虑更多,因为我必须先在 B 上工作,然后再显示 A。但这也是可能的。谢谢!
    • 这意味着我只能将一百多个查询合并为一个 :)
    【解决方案2】:

    如果您拥有的是层次结构,则为“有向无环图”。 SQL 不做这些。

    SQL 没有其他图论的事情。

    由于 SQL 不这样做,因此“从不将 SQL 置于循环中”的规则不再适用。

    对于层次结构和其他涉及格和网络的图形连接问题,您必须将 SQL 置于循环中。

    确实,对于层次结构,您必须使用递归循环将层次结构的所有元素连接到任意深度。

    另一方面,如果您只是将查询结果重新格式化为嵌套层次结构,那么您只是将单个 SQL 结果集重新格式化为嵌套列表。

    这将是一个围绕结果集具有复杂循环的选择。一个选择(不在循环中)和一个复杂的循环来处理一个结果集。

    【讨论】:

    • 好的,我得到了第一部分,但第二部分让我很困惑。如果我的示例中的内容完全符合我的要求,那么简单的“每组几个项目”设计,我想循环遍历组和组内的项目。然后?有没有可能?
    • 你疯了!我的应用整天都在这样的网格中显示数据。他基本上只想第一次只显示A.a,但每次都列出B.b+B.a。循环结果集并让 php 构建 html。你仍然只需要一个 SQL 结果集。
    • 是的,来吧伙计们,迷惑我:P
    • 可能这就是他对第二部分的看法,但他就是这样的教授。我的意思是你没有得到 35,000 个代表来询问和回答简单的问题 :)
    • @tharkun,解决方法很简单,不需要“复杂循环”,只需要简单循环,简单解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 2014-12-23
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多