1

前段时间我问了一个关于 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

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

水果

  • 黄色香蕉
  • 红苹果

动物

  • 黑白斑马
  • 灰象
  • 红狐

行星

  • 蓝色地球
  • 红色火星

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

目前我这样做是我的老方法:

查询组

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

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

4

2 回答 2

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

遍历所有行:

  • 当 Aa 改变时,输出标题
  • 然后总是输出 Bb + Ba 值

应用程序调用 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
于 2009-04-22T21:07:29.373 回答
1

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

SQL 没有做其他图论的事情。

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

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

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

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

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

于 2009-04-22T20:57:49.177 回答