在Laravel DB::raw()中对列进行SQL查询以排序并获得第一个结果



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

Illuminate\Database\QueryException,消息为'SQLSTATE[42000]:语法错误或访问违规:1064您的SQL语法中有错误

我缺少什么?

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个条目,所以每个月可能有3000个条目,我每天只需要得到一个条目,这样我就得到了30个条目,然后把这30个结果加起来,就得到了一个月的一个结果,所以我在返回的集合中得到了5个条目,但现在我似乎无法获得DB::raw('FIRST(event_count ORDER BY created_at DESC ) as sessions')来获取该列,订购它,只得到第一个结果。

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

  1. 每天一行event_count列存在。根据您在上面的注释,列会递增,您需要最后一个值,因此您需要每天max
  2. event_count列的值求和,按月份和年份分组

1:

对此的select语句看起来像

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();

最新更新