MySQL + php:查询的每一行的新查询?

时间:2013-06-07 13:31:20

标签: php mysql web-applications

这是我一直在弹出的主题。对于返回行列表的查询类型,我们通常希望执行进一步的查询以收集有关该特定行的更多信息,这通常包括本身返回行列表的查询。例如,订单系统返回客户列表,每个客户“行”也可以显示订单列表(可能在弹出对话框中)。

通常“更好”:

  1. 执行单个查询,尽可能使用GROUP_CONCAT并以编程方式拆分结果(返回的连接长度有限制)
  2. 在循环查看“父查询”
  3. 的结果时,为每一行执行“子查询”
  4. 执行一个“父查询”以使用SQL IN关键字返回客户列表和一个“订单”查询,以匹配从上一个查询返回的customer_ID。循环查看客户查询的结果,我们可以查看订单查询中是否存在customer_ID并显示匹配的订单。
  5. 执行第二个查询。原因是我们并不总是希望看到每个父结果的子结果(使用Web应用程序,我们可以使用AJAX来获取子结果)
  6. 别的什么?
  7. 我一直倾向于#2,从概念上讲它似乎是最干净的解决方案,但我不禁认为这是一种资源匮乏。为特定的结果集做我们自己的基准测试,#3最快。 #4似乎应该是最快的,因为一些应用程序不需要显示所有结果,但是,目的可能是让结果准备好并等待,而不是另一个往返来检索该行的子数据。我不完全确定FETCH_ASSOC等的机制是如何工作的,但是非常欢迎任何建议!

1 个答案:

答案 0 :(得分:2)

我认为#3更好。 我建议获取所有客户,然后列出该客户的所有订单(customer_ID IN(...)),然后在需要时将订单发送给php侧的正确客户。

这样,您只获得两个包含所有信息的查询,并且可以避免调度部分(取决于在此查询之后要执行的逻辑)。

请记住,查询本身的大部分开销来自查询本身(传输查询,然后获取数据) 数据库针对搜索和连接等方面进行了高度优化,因此选择数据不是瓶颈(直到达到非常高的数字),因此这是另一种解决方案。

另外,如果您使用IN选择索引,数据库甚至不必搜索该术语,只需查看索引,然后直接转到每一行。

根据您的应用程序,如果用户仅查看显示的100个客户的一个或两个订单列表,则#4会更好。

无论如何,考虑在循环中进行SQL查询通常是一种不好的做法/糟糕的设计/错误的逻辑。