【发布时间】:2018-12-20 14:59:04
【问题描述】:
我正在尝试将一些统计逻辑完全转移到 SQL 中以极大地提高性能,但是它非常复杂,我不确定如何使用 SQL 中的过程/函数来实现这一点 - 或者它是否可能。
统计表如下所示:
表格中的行如下所示:
这是我要转换的代码。 $this->stats 是表中所有行的 Eloquent 集合:
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 等带有下面的值。
任何帮助将不胜感激!
【问题讨论】:
-
桌子长什么样?
-
这不是数据库查询,而是带有一些功能的 Laravel 集合。
$this->stats来自哪里? -
更新后的帖子 -
$this->stats是表中所有行的 Eloquent 集合 -
也添加了表格图片
标签: php mysql laravel collections