代码之家  ›  专栏  ›  技术社区  ›  markus

如何在两个或多个嵌套循环中迭代连接的数据?

  •  1
  • markus  · 技术社区  · 15 年前

    不久前我问 a question about nested loops 实际上,在我的示例的循环中有一些查询,我得到了一个明确的答案:

    从不将SQL查询放入循环中

    从那以后我就试过了,大部分都能用。只需要努力编写一个查询,一次检索所有需要的内容。

    但是,如果连接查询中有一个数据集,其中包含需要以嵌套方式输出的嵌套数据,那么该怎么做呢?

    表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
    

    好了,现在我在一个数组或行集中得到了所有这些,现在我需要显示如下内容:

    水果

    • 黄色的香蕉
    • 红苹果

    动物

    • 黑白斑马
    • 灰斑
    • 红狐

    行星

    • 蓝土
    • 红色火星

    很明显,这是可行的,但我已经试过好几次了,我只是想不出一个解决办法。

    现在我用我的老方法:

    query groups
    
    foreach groups
    {
        query animals in group
        foreach animal
    }

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

    2 回复  |  直到 15 年前
        1
  •  3
  •   KM.    15 年前

    使用控制中断算法。

    我将返回一个结果集,正如您在问题中所示:

    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
    
        2
  •  1
  •   S.Lott    15 年前

    如果你有一个层次结构,一个“有向无环图”。SQL不执行这些操作。

    还有其他一些图理论是SQL不做的。

    因为SQL不这样做,所以“从不将SQL放入循环中”规则将从窗口中消失。

    您必须将SQL放入一个循环中,以解决涉及格和网络的层次结构和其他图形连接问题。

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

    另一方面,如果只是将查询结果重新格式化为类似于嵌套层次结构,那么只需将单个SQL结果集重新格式化为似乎是嵌套列表的内容。

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