【问题标题】:Convert complex query from Laravel to SQL将复杂查询从 Laravel 转换为 SQL
【发布时间】: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-&gt;stats 来自哪里?
  • 更新后的帖子 - $this-&gt;stats 是表中所有行的 Eloquent 集合
  • 也添加了表格图片

标签: php mysql laravel collections


【解决方案1】:

我要了解 Laravel 是如何做到这一点的第一步是启用查询日志记录和转储查询;

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

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

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

【讨论】:

  • 哦,抱歉,我可能不太清楚 - 我上面的代码来自 Laravel Collections,所以 $this-&gt;stats 只是表中的所有行。
【解决方案2】:

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

生成的表格数据将与此类似。

【讨论】:

  • 我已更新答案以与表格结构对齐。
猜你喜欢
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 2015-12-23
  • 2014-05-30
相关资源
最近更新 更多