前段时间我问过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
好吧,现在我把它全部放在数组或行集中,现在我需要显示类似的内容:
水果
动物
行星
目前我以旧的方式做到了:
query groups foreach groups { query animals in group foreach animal }
但是,嘿,永远不要把sql放在循环中。那么我做什么呢?我做PHP,但我认为这是一个元问题。
答案 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
遍历所有行:
应用程序调用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结果集重新格式化为看似嵌套的列表。
这将是一个选择,结果集周围有复杂的循环。一个选择 - 不在循环中 - 和一个复杂的循环来处理一个结果集。