Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL+;php:查询中每一行的新查询?_Php_Mysql_Web Applications - Fatal编程技术网

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

MySQL+;php:查询中每一行的新查询?,php,mysql,web-applications,Php,Mysql,Web Applications,在我所在的地方,这是一个经常出现的话题。对于返回行列表的查询类型,我们通常希望执行进一步的查询,以收集有关该特定行的更多信息,这通常包括本身返回行列表的查询。这方面的一个例子是订单系统,它返回客户列表,每个客户的“行”也可能显示其订单列表(可能在弹出对话框中) 一般而言,以下做法是否“更好”: 在可能的情况下,使用GROUP\u CONCAT执行一个查询,并以编程方式分割结果(返回的串联长度有限制) 对每行执行“子查询”,同时循环遍历“父查询”的结果 执行一次“父查询”以返回客户列表,并使用关键

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

一般而言,以下做法是否“更好”:

  • 在可能的情况下,使用
    GROUP\u CONCAT
    执行一个查询,并以编程方式分割结果(返回的串联长度有限制)
  • 对每行执行“子查询”,同时循环遍历“父查询”的结果
  • 执行一次“父查询”以返回客户列表,并使用关键字中的SQL
    执行一次“订单”查询以匹配从上一次查询返回的客户ID。循环浏览客户查询的结果,我们可以查看订单查询中是否存在客户ID,并显示匹配的订单
  • 在需要时执行第二个查询。原因是我们并不总是希望看到每个父结果的子结果(使用web应用程序,我们可以使用AJAX获取子结果)
  • 还有别的吗
  • 我一直倾向于#2,因为从概念上讲,它似乎是最干净的解决方案,但我忍不住认为它是一个资源猪。为一组特定的结果做我们自己的基准测试,#3出来的速度最快#4似乎应该是最快的,因为有些应用程序不需要显示所有结果,但是,其目的可能是让结果准备就绪并等待,而不是再次往返以检索该行的子数据。我不完全确定
    FETCH\u ASSOC
    等机制是如何工作的,但欢迎提供任何建议

    我认为3号更好。 我建议获得所有客户,然后列出该客户的所有订单(客户ID在(…)中),然后根据需要将订单发送给php端的正确客户

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

    记住,查询的大部分开销来自查询本身(传输查询,然后返回数据) 数据库在搜索和连接等方面进行了高度优化,所以选择数据不是瓶颈(直到达到非常高的数字),所以这是另一个解决方案

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

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


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

    这里不能使用任何原因
    内部联接
    或其相关(
    联接
    )吗?也就是说,如果你想在另一个页面上显示客户的订单,或者你不介意AJAX调用,我建议#4。如果你想立即使用所有结果,我喜欢#3。否则,请使用#4。#3的另一个扭曲是将两个查询打包到一个存储过程中,该存储过程返回两个结果集。只需一次访问数据库。