我正试图在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
根本不是一个函数,因此出现了错误。如果我们把你的问题分成两个你想要的:
-
每天一行,
event_count
列存在。根据您在上面的注释,列会递增,您需要最后一个值,因此您需要每天max
值 - 对
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();