我正试图将一些统计逻辑完全移到SQL上以大大提高性能,但是它相当复杂,我不确定如何使用SQL中的过程/函数来实现这一点-甚至是否可能。
统计信息表如下:
表中的行看起来像这样:
这是我要转换的代码。 $this->stats
是表中所有行的口才集合:
return $this->stats
->groupBy(function ($stat) {
return $stat->created_at->format('Y-m-d');
})
->map(function ($stats) {
$times = [];
for ($hour = 0; $hour < 24; $hour++) {
$thisHour = $stats->filter(function ($stat) use ($hour) {
return (int) $stat->created_at->format('H') === $hour;
});
$times[$hour] = $thisHour->isNotEmpty()
? $thisHour->sum(function ($stat) {
return $stat->data->count;
}) : 0;
}
return $times;
});
这将输出如下内容:
{
"2018-12-20": {
0: 54,
1: 87,
2: 18,
3: 44,
4: 35,
...
}
}
因此,它按日期分组,每个日期包含0-23(一天中的小时数)以及相应的值(在这种情况下,该行的data-> count属性之和)。
在另一个查询中,我已经可以通过使用以下命令获取data-> count属性的总和:
SELECT SUM(data->>\"$.count\") AS value
那么这甚至可以在SQL中完成吗?我正在想象有一个日期列,再加上小时列,所以下面是值的hour_0,hour_1等。
任何帮助将不胜感激!
答案 0 :(得分:1)
我要了解Laravel的工作方式的第一步是启用查询日志记录并转储查询;
add .SideIndicator...
这将使您可以用普通SQL重新创建Eloquent查询。从那里,您可以进行优化和压缩。
答案 1 :(得分:0)