我试图将一些统计逻辑完全转移到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中是否可能实现呢?我想象有一个日期列,加上小时列,所以小时0,小时1等等,下面有值。
任何帮助都将不胜感激!
2条答案
按热度按时间e3bfsja21#
我要理解laravel是如何做的第一步是启用查询日志记录和转储查询;
这将允许您在纯sql中重新创建雄辩的查询。从那里,你可以在优化和压缩工作。
https://laravel.com/docs/5.0/database#query-伐木
k2arahey2#
被剥夺的
由于您现在已经包括了表结构,下面的查询将以表格格式提供所需的结果。您需要解析结果以转换为json。
更新的sql
得到的表格数据与此类似。