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

时间:2009-04-22 20:52:28

标签: join loops nested-loops

前段时间我问过a question about nested loops关于SO的问题,在我的例子的循环中有查询,我得到了一个明确的答案:

  

永远不要在循环中放入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
好吧,现在我把它全部放在数组或行集中,现在我需要显示类似的内容:

水果

  • 黄香蕉
  • 红苹果

动物

  • 黑色和白色斑马
  • grey elefant
  • 红狐狸

行星

  • 蓝色地球
  • 红色火星
很明显,它应该可以工作,但我已经尝试过多次思考它并且我无法想出解决方案。

目前我以旧的方式做到了:

query groups

foreach groups
{
    query animals in group
    foreach animal
}

但是,嘿,永远不要把sql放在循环中。那么我做什么呢?我做PHP,但我认为这是一个元问题。

2 个答案:

答案 0 :(得分:3)

使用控制中断算法。

我将完全按照您在问题中显示的结果集返回结果集:

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

答案 1 :(得分:1)

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

SQL没有其他的图论理论。

由于SQL不这样做,所以“永远不会把SQL放在循环中”规则就会消失。

您必须将SQL放在循环中,以获取涉及格子和网络的层次结构和其他图形连接问题。

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

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

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