【发布时间】:2013-06-07 13:31:20
【问题描述】:
这是一个在我所在的地方一直弹出的主题。对于返回行列表的查询类型,我们通常希望执行进一步的查询以收集有关该特定行的更多信息,这通常包括本身返回行列表的查询。这方面的一个例子是返回客户列表的订单系统,每个客户“行”也可能显示他们的订单列表(可能在弹出对话框中)。
一般来说“更好”吗:
- 执行一个查询,尽可能使用
GROUP_CONCAT并以编程方式拆分结果(返回的串联长度存在限制) - 在遍历“父查询”的结果时对每一行执行“子查询”
- 使用 SQL
IN关键字执行一个“父查询”以返回客户列表,并执行一个“订单”查询以匹配从前一个查询返回的 customer_ID。循环通过客户查询的结果,我们可以查看订单查询中是否存在customer_ID,并显示匹配的订单。 - 在何时执行第二个查询。原因是我们并不总是希望看到每个父结果的子结果(使用网络应用,我们可以使用 AJAX 来获取子结果)
- 还有别的吗?
我一直倾向于 #2,因为从概念上讲它似乎是最干净的解决方案,但我不禁认为它是一种资源消耗。对一组特定的结果进行我们自己的基准测试,#3 出来的速度最快。 #4 似乎应该是最快的,因为某些应用程序不需要显示所有结果,但是,目的可能是让结果准备好并等待,而不是另一个往返来检索该行的子数据。我不完全确定 FETCH_ASSOC 等的机制是如何工作的,但非常欢迎任何建议!
【问题讨论】:
-
有什么原因不能在这里使用
INNER JOIN或其亲属(LEFT和RIGHTJOIN's)?也就是说,如果您要在不同的页面中显示客户的订单,或者您不介意 AJAX 调用,我建议使用 #4。 -
如果您要立即使用所有结果,我喜欢#3。否则,使用#4。 #3 的另一个转折是将两个查询打包到一个存储过程中,该过程返回两个结果集。这将只是一次访问数据库。
标签: php mysql web-applications