gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:53:23 25 4
gpt4 key购买 nike

我一直在努力找出处理显示子数据的最佳、最有效的方法。在我的具体案例中,我使用 PHP 和 MySQL,但我觉得这更像是一种“通常使用任何语言”的交易。

我的两个想法是(在这个例子中,我将列出发票及其行项目)

  1. 将子数据(发票项目)连接到主数据(发票)以便只有一个查询我的问题是,假设我的发票上有 500 个行项目(可能不现实,但是发生了),那么我会从 MySQL 服务器向我的 PHP 脚本发送总发票数据的 500 倍,这听起来很荒谬,因为我只需要一次。

  2. 第二个选项是在循环发票并显示整体发票数据时选择发票的行项目。当然,这现在与数据库的联系次数增加了 500 次。

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

最佳答案

Joining the child data (invoice items) to the main data (invoices) as to only have a single query

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

但是。

  1. 这就是可以从客户端指定到 RDBMS 的压缩连接的原因......压缩可以减轻冗余数据的网络开销。
  2. 单个结果集中的冗余数据的成本远低于重复查询的成本。

大多数人只是检索此类应用程序中的冗余数据。 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 程序中的它们与主记录进行匹配。您基本上是在应用程序代码中进行连接。

如果这一切听起来太麻烦了……那就去找冗余数据并完成你的项目吧。如果需要,您可以随时进行优化。

关于php - 如何避免在子数据循环内调用数据库查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43377845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com