将复杂查询从laravel转换为sql

q9rjltbz  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(343)

我试图将一些统计逻辑完全转移到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等等,下面有值。
任何帮助都将不胜感激!

e3bfsja2

e3bfsja21#

我要理解laravel是如何做的第一步是启用查询日志记录和转储查询;

DB::connection()->enableQueryLog();
// ... do your query
$queries = DB::getQueryLog();

这将允许您在纯sql中重新创建雄辩的查询。从那里,你可以在优化和压缩工作。
https://laravel.com/docs/5.0/database#query-伐木

k2arahey

k2arahey2#

被剥夺的
由于您现在已经包括了表结构,下面的查询将以表格格式提供所需的结果。您需要解析结果以转换为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

得到的表格数据与此类似。

相关问题