将复杂的查询从Laravel转换为SQL

时间:2018-12-20 14:59:04

标签: php mysql laravel collections

我正试图将一些统计逻辑完全移到SQL上以大大提高性能,但是它相当复杂,我不确定如何使用SQL中的过程/函数来实现这一点-甚至是否可能。

统计信息表如下:

enter image description here

表中的行看起来像这样:

enter image description here

这是我要转换的代码。 $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等。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

我要了解Laravel的工作方式的第一步是启用查询日志记录并转储查询;

add .SideIndicator...

这将使您可以用普通SQL重新创建Eloquent查询。从那里,您可以进行优化和压缩。

https://laravel.com/docs/5.0/database#query-logging

答案 1 :(得分:0)

UDPATED

由于您现在已包含表结构,因此以下查询应以表格格式为您提供所需的结果。您需要解析结果以转换为json。

更新的SQL

SELECT DATE_FORMAT(stats.updated_at, "%Y-%m-%d") AS `date`,
    HOUR(stats.updated_at) AS `hour`,
    COUNT(stats.id) AS record_count
FROM stats
GROUP BY `date`, `hour`
ORDER BY 1 ASC, 2 ASC

生成的表格数据看起来与此类似。

enter image description here