【问题标题】:Group by month and order the dates on Laravel Eloquent按月分组并在 Laravel Eloquent 上排序日期
【发布时间】:2019-11-08 12:22:30
【问题描述】:

我有以下查询

$months = \App\DATA::select(
    DB::raw('sum(order_value) as `sums`'),
    DB::raw("DATE_FORMAT(created_at,'%M %Y') as months")
)
    ->where("created_at", ">", \Carbon\Carbon::now()->subMonths(6))
    ->groupBy('months')
    ->get();

对过去 6 个月中每个月的数据求和。问题是它按字母顺序输出日期。

August 2019
July 2019
June 2019
May 2019
November 2019
October 2019
September 2019

我无法通过orderBy 订购它:

->orderBy('created_at')

由于以下问题

SQLSTATE[42000]: 语法错误或访问冲突:1055 ORDER BY 子句的表达式 #1 不在 GROUP BY 子句中并且包含非聚合列

如何按日期订购?

【问题讨论】:

    标签: php mysql laravel eloquent


    【解决方案1】:

    试试max函数和->orderBy('createdAt', 'desc')

    $months = \App\DATA::select(
           DB::raw('sum(order_value) as `sums`'),
           DB::raw("DATE_FORMAT(created_at,'%M %Y') as months"),
           DB::raw('max(created_at) as createdAt')
    )
          ->where("created_at", ">", \Carbon\Carbon::now()->subMonths(6))
          ->orderBy('createdAt', 'desc')
          ->groupBy('months')
          ->get();
    

    【讨论】:

    • 这里潜在的报告问题是您正在选择一个新列,而 OP 的初始查询没有。
    • 谢谢!这仅在 orderBy 更改为 createdAt 而不是 created_at 时有效。
    【解决方案2】:

    只需通过created_at 订购您的数据:

    $months = \App\DATA::select(
        DB::raw('ANY_VALUE(created_at) AS created_at')
        DB::raw('sum(order_value) as `sums`'),
        DB::raw("DATE_FORMAT(created_at,'%M %Y') as months")
    )
        ->where("created_at", ">", \Carbon\Carbon::now()->subMonths(6))
        ->orderBy('created_at')
        ->groupBy('months')
        ->get();
    

    【讨论】:

    • 如果被分组,不能这样排序。 SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column
    • 尝试在选择中添加created_at。我已经编辑了我的答案
    猜你喜欢
    • 2017-03-24
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    相关资源
    最近更新 更多