【问题标题】:MySQL + php: new query for each row of a query?MySQL + php:查询的每一行的新查询?
【发布时间】:2013-06-07 13:31:20
【问题描述】:

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

一般来说“更好”吗:

  1. 执行一个查询,尽可能使用GROUP_CONCAT 并以编程方式拆分结果(返回的串联长度存在限制)
  2. 在遍历“父查询”的结果时对每一行执行“子查询”
  3. 使用 SQL IN 关键字执行一个“父查询”以返回客户列表,并执行一个“订单”查询以匹配从前一个查询返回的 customer_ID。循环通过客户查询的结果,我们可以查看订单查询中是否存在customer_ID,并显示匹配的订单。
  4. 在何时执行第二个查询。原因是我们并不总是希望看到每个父结果的子结果(使用网络应用,我们可以使用 AJAX 来获取子结果)
  5. 还有别的吗?

我一直倾向于 #2,因为从概念上讲它似乎是最干净的解决方案,但我不禁认为它是一种资源消耗。对一组特定的结果进行我们自己的基准测试,#3 出来的速度最快。 #4 似乎应该是最快的,因为某些应用程序不需要显示所有结果,但是,目的可能是让结果准备好并等待,而不是另一个往返来检索该行的子数据。我不完全确定 FETCH_ASSOC 等的机制是如何工作的,但非常欢迎任何建议!

【问题讨论】:

  • 有什么原因不能在这里使用INNER JOIN 或其亲属(LEFTRIGHT JOIN's)?也就是说,如果您要在不同的页面中显示客户的订单,或者您不介意 AJAX 调用,我建议使用 #4。
  • 如果您要立即使用所有结果,我喜欢#3。否则,使用#4。 #3 的另一个转折是将两个查询打包到一个存储过程中,该过程返回两个结果集。这将只是一次访问数据库。

标签: php mysql web-applications


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多