【问题标题】:SQL query in Laravel DB::raw() to order column and get first resultLaravel DB::raw() 中的 SQL 查询对列进行排序并获得第一个结果
【发布时间】:2021-06-09 18:48:44
【问题描述】:

我正在尝试在我的 DB::raw() 选择语句中订购一个特定的列,我需要为每一天订购项目并为每一天获取第一个项目,所以我最终会在 5 个月内得到 5 个结果但我的错误是

Illuminate\Database\QueryException with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax

我错过了什么?

GoogleAnalytics::where('event_category', 'Category')
                ->where('event_action', 'Action')
                ->whereDate('period_from', '>=', '2021-06-08')
                ->whereDate('period_to', '<=', '2021-06-08')
                ->select(DB::raw('DATE_FORMAT(created_at, "%Y-%m") as created_at'), DB::raw('FIRST(event_count ORDER BY created_at DESC ) as sessions'))
                ->groupByRaw('DATE_FORMAT(created_at, "%Y-%m")')
                ->orderBy('created_at', 'desc')
                ->get();

这里有更多上下文,每天可能有 100 个条目,因此每月可能有 3,000 个条目,我每天只需要获取一个条目,所以我最终得到 30 个条目,然后将这 30 个结果相加为那个月产生一个结果,所以我最终会在我返回的集合中得到 5 个项目,但现在我似乎无法让 DB::raw('FIRST(event_count ORDER BY created_at DESC ) as sessions') 获取该列,订购它并获得第一个结果.

【问题讨论】:

  • 我认为 FIRST 根本不是一个函数,因此出现了错误。一天中所有行的event_count 列是否相同?
  • event_count 全天递增,并在第二天开始时重置为 0,它是从 Google Analytics 中提取的数据,我需要添加每月每一天的最后一个结果在一起。

标签: php laravel


【解决方案1】:

我认为FIRST 根本不是一个函数,因此出现了错误。如果我们将您的问题分成您想要的两个:

  1. 一行 表示每一天,其中存在 event_count 列。根据您在列上方的评论,您需要最后一个值,因此您需要每天的 max 值。
  2. event_count 列的值求和,按月和年分组

1:

对此的选择语句如下所示

select date(created_at), max(event_count) from google_analytics group by date(created_at) where ...

使用 Eloquent 构建器看起来像这样:

$query = GoogleAnalytics::select(
            DB::raw('date(created_at) as created_at'),
            DB::raw('max(event_count) as sessions')
        )
        ->where('event_category', 'Category')
        ->where('event_action', 'Action')
        ->whereDate('period_from', '>=', '2021-06-08')
        ->whereDate('period_to', '<=', '2021-06-08')
        ->groupByRaw('date(created_at)');

注意:

  • 您的 where 子句只查看一个日期 (2021-06-08)
  • 此查询不会返回完整的GoogleAnalytics 模型

2:

我们可以使用上面的$query对每个月的结果进行分组:

$result = DB::table($query, 'per_day')->select(
            DB::raw('date_format(created_at, "%Y-%m") as created_at'),
            DB::raw('sum(sessions) as sessions')
        )
        ->groupByRaw('date_format(created_at, "%Y-%m")')
        ->orderByRaw('date_format(created_at, "%Y-%m") desc')
        ->get();

【讨论】:

    猜你喜欢
    • 2013-08-09
    • 2011-09-28
    • 1970-01-01
    • 2021-08-19
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多