Laravel中使用where条件查询含temperature字段最小/最大值的全量行数据
正确实现方案
方法1:子查询一次性查询(推荐,仅执行1次SQL)
直接在where条件中嵌套最小值查询,一次返回所有符合条件的完整行:
// 拆分写法逻辑更清晰,实际仅执行2次简单查询,性能开销极低 $minTemperature = rawData::whereDate('acktime', $thisDay)->min('temperature'); $rows = rawData::whereDate('acktime', $thisDay) ->where('temperature', $minTemperature) ->get();
如果要完全合并为单次查询,可以用闭包写嵌套子查询:
$rows = rawData::whereDate('acktime', $thisDay) ->where('temperature', function ($query) use ($thisDay) { $query->from('raw_datas') // 此处替换为你的实际表名 ->whereDate('acktime', $thisDay) ->selectRaw('min(temperature)'); })->get();
方法2:集合过滤(适合单日数据量较小的场景)
如果单日数据量在千级以内,可以先查询当日所有数据,再用集合方法筛选最小值对应的行:
$allDayRows = rawData::whereDate('acktime', $thisDay)->get(); $minTemperature = $allDayRows->min('temperature'); $rows = $allDayRows->where('temperature', $minTemperature);
之前写法的问题说明
- 第一种/第二种写法:
min()是聚合方法,调用后会直接返回温度的数值结果,不会返回行集合 - 第三种写法:
get('acktime')仅查询了acktime字段,结果集中不存在temperature字段,所以取min返回null - 第四种写法:
min('temperature')执行后已经返回浮点型的最小值数值,后续再调用get()方法会抛出类型错误
内容的提问来源于stack exchange,提问作者Stefano Martini
相关产品推荐
相关产品推荐

