【发布时间】:2018-10-07 17:49:05
【问题描述】:
在我正在重构的一段代码中,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 中执行此操作,但我还没有找到一种方法来使用内部查询或子查询来执行此操作。我想用更好/更有经验的头脑来检查一下这个元素。
欢迎大家指点! 谢谢
【问题讨论】:
-
这不行吗? SELECT a FROM b WHERE c in(1,2,3,4,5) GROUP BY c ORDER BY min(f)
-
按 c 分组 - 我没想过这样做。您能否将其写为答案,我将使用数据集进行尝试。看起来它会做到这一点!感谢您以另一种方式看待问题。
标签: php mysqli query-optimization