php - 如何删除一个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 中执行此操作,但我还没有找到一种方法来使用内部查询或子查询来执行此操作。正是这个元素,我想用更好/更有经验的头脑进行理智检查。
欢迎任何指点!谢谢
解决方案
我认为以这种方式构建您的查询应该会得到您期望的结果:
SELECT a FROM b WHERE c in(1,2,3,4,5) GROUP BY c ORDER BY min(f);
因为 GROUP BY 只会输出每列“c”的单行。
推荐阅读
- python - root.after 有问题
- sql - 使用外键将行插入表中
- android - Android中的九个补丁与矢量
- .htaccess - .htaccess 重写 Category/page/1
- android - 在 Android 中为 PDF、文本和图像创建文件资源管理器
- lambda - Kotlin 创建一个类的实例并在一行代码中实现回调
- python - 在 python 中支持 POSIX openat 函数
- ios - 使用 UIView.animateKeyframes 为 CAShapeLayer 属性设置动画
- python - Clang + pycparser 无法从 CPython 3.7 解析 pythread.h 标头
- javascript - 通过数组值实时搜索