首页 > 解决方案 > 如何删除一个php循环以减少mysql查询的数量

问题描述

在我正在重构的一段代码中,while 循环遍历来自数据库查询的结果集并执行查询子集。

在大多数情况下,可以提取这些循环以使用更大的传递参数集执行更少的查询。

但是,我不确定如何处理这个特定的查询,其中 ORDER BY 和 LIMIT 1 使得它更难弄清楚如何优化它。关于如何处理此查询类型的任何观点都将受到欢迎:

例子:

$e   = array( ... );
foreach($e as $i=>j) {
    $sql = "SELECT a FROM b WHERE c = '".(int)$j."' ORDER BY f LIMIT 1";
    $res = $db->query($sql);
}

一种可能的方法是在没有ORDER/LIMIT条件的情况下进行选择,并通过 PHP 循环在 PHP 中进行过滤,但只有 1 个查询,但是有没有更好的方法来减少返回的结果集?

编辑: 为了更好地澄清,我正在扩展一些更多信息。如果有 5000 条记录会在上面的简化结构中返回,那么在优化循环外查询之后,最终结果集中也需要 5000 条记录。LIMIT 1 子句不允许在外部 SQL 中执行此操作,但我还没有找到一种方法来使用内部查询或子查询来执行此操作。正是这个元素,我想用更好/更有经验的头脑进行理智检查。

欢迎任何指点!谢谢

标签: phpmysqliquery-optimization

解决方案


我认为以这种方式构建您的查询应该会得到您期望的结果:

SELECT a FROM b WHERE c in(1,2,3,4,5) GROUP BY c ORDER BY min(f);

因为 GROUP BY 只会输出每列“c”的单行。


推荐阅读