如何避免在循环内调用子数据的数据库查询

时间:2017-04-12 19:14:13

标签: php mysql database loops nested-queries

我一直在努力寻找处理显示子数据的最佳,最有效的方法。在我的具体情况下,我使用的是PHP和MySQL,但我觉得这更像是一种"通常用任何语言"有点交易。

我的两个想法是(对于这个例子,我将列出发票及其订单项)

  1. 将子数据(发票项目)与主数据(发票)联系起来只有一个查询我的问题是,我说发票上有500个订单项(可能不太现实,但是事情发生了),然后我会将整个发票数据从MySQL服务器发送到我的PHP脚本500次,这听起来很荒谬,因为我只需要一次。

  2. 第二个选项是,在循环显示发票并显示整个发票数据时,选择发票的订单项。当然,这现在更多次联系数据库500.

  3. 是否还有其他选项可以处理具有逻辑意义的数据(使用给定的架构)?我几乎100%肯定有,因为我无法相信我是第一个考虑这个问题的人,但我认为我很难找到正确的方法搜索有关此主题的更多信息。

1 个答案:

答案 0 :(得分:1)

  

将子数据(发票项目)与主数据(发票)相关联,只有一个查询

这是处理此要求的传统方式。它确实处理冗余数据,并且存在一些开销。

但是

  1. 这就是为什么可以从客户端指定到RDBMS的压缩连接...压缩可以减轻冗余数据的网络开销。
  2. 单个结果集中的冗余数据的成本远低于重复查询。
  3. 大多数人只是在这种应用程序中检索冗余数据。像Crystal Reports这样的程序产品可以做到这一点。

    如果它只是为你工作,你可以为你的主记录检索并保存一个结果集......也许是这样的。

       SELECT master_id, name, address, whatever
         FROM master m
        WHERE m.whatever = whatever
        ORDER BY whatever
    

    然后,通过master_id将它们放入关联数组中。

    然后,检索详细记录。

      SELECT d.master_id, d.detail_id, d.item, d.unit, d.quantity
        FROM detail d
        JOIN master m ON d.master_id = m.master_id
       WHERE m.whatever = whatever
       ORDER BY d.master_id, d.detail_id, whatever
    

    您将获得一个结果集,其中包含标有master_id值的所有相关明细记录(发票项)。你可以在php程序中将它们与主记录进行匹配。您基本上是在加入应用程序代码。

    如果所有这些听起来像是脖子上的痛苦......只需要获取冗余数据并完成项目。如果必须,您可以随时优化。