返回按日期排序的数据

Posted

技术标签:

【中文标题】返回按日期排序的数据【英文标题】:Return data ordered by date 【发布时间】:2018-05-16 22:38:22 【问题描述】:

我有一个函数可以返回每天的销售额。这种方法的问题是我希望数据按日期存储,但我按以下顺序获取它们:

01-Dec
02-Dec
03-Dec
03-Nov
04-Nov
05-Nov
etc.

我明白为什么会发生这种情况,但我不知道如何解决它。我可以用 startofmonth 替换 subMonth(1) ,这将部分解决我的问题,但这不是我想要的。相反,我想退回最近 30 天的订单。

    return DB::table('sales')
        ->select(\DB::RAW('DATE_FORMAT(created_at, "%d-%M") as date'), \DB::raw('COUNT(*) as count'))
        ->where('created_at', '>=', Carbon::now()->subMonth(1))
        ->orderBy('date')
        ->groupBy('date')
        ->get(['date', 'count'])
        ->keyBy('date')
        ->transform(function ($data) 
            return $data->count;
        );

我也试过 orderBy('created_at') 但它给了我下面的错误,我想避免更改 sql 模式。

Syntax error or access violation: 1055 Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'x.sales.created_at' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

编辑: 根据要求,这是return语句的sql查询

select DATE_FORMAT(created_at, "%d-%M") as date, COUNT(*) as count from `sales` where `created_at` >= ? group by `date` order by `date` asc

【问题讨论】:

请发布生成的 SQL @lad2025 我刚刚做了:) 请尝试:->groupBy('1') 而不是->groupBy('date') 为什么需要 groupBy ? @George 我的建议有帮助吗? 【参考方案1】:

我对您的框架查询语法不太了解。但是您可以多取一列 DATE_FORMAT(created_at, "%Y%m%d") AS order_column 并应用订单,并在“order_column”列上分组并在显示数据时使用“data”列。

select DATE_FORMAT(created_at, "%Y%m%d") AS order_column, DATE_FORMAT(created_at, "%d-%M") as date, COUNT(*) as count from `sales` where `created_at` >= ? group by `order_column` order by `order_column` asc



return DB::table('sales')
        ->select(\DB::RAW('DATE_FORMAT(created_at, "%Y%m%d") AS order_column'),\DB::RAW('DATE_FORMAT(created_at, "%d-%M") as date'), \DB::raw('COUNT(*) as count'))
        ->where('created_at', '>=', Carbon::now()->subMonth(1))
        ->orderBy('order_column')
        ->groupBy('order_column')
        ->get(['date', 'count'])
        ->keyBy('date')
        ->transform(function ($data) 
            return $data->count;
        );

【讨论】:

是的,这与获取原始的“created_at”值相同。我可以按原始 created_at 排序,但在这两种情况下我都得到了上面提到的错误(sql_mode=only_full_group_by)。我想我将不得不更改 mysql 设置以完成此操作...【参考方案2】:

如果你分两步完成它,它会起作用吗?

在其中创建日期列的第 1 步:

$step1 = DB::table('sales') ->select(\DB::RAW('DATE_FORMAT(created_at, "%d-%M") as date'))) 
->where('created_at', '>=', Carbon::now()->subMonth(1)) 
->orderBy('date') 
->get(['date', 'count']) 

然后你进行聚合:

$step2 = $step1->select('date'), \DB::raw('COUNT(date) as count')) 
->groupBy('date') ->get(['date', 'count']) ->keyBy('date')

希望对你有帮助!

【讨论】:

以上是关于返回按日期排序的数据的主要内容,如果未能解决你的问题,请参考以下文章

Easy Admin 3 按日期排序返回:create_date 没有名为 create_date 的字段或关联

SQL多表联合查询按日期排序

如何将 PDO::FETCH_GROUP 与表连接一起使用,并且只返回按日期排序的连接表中的 3 条记录

在python中按日期时间对字典列表进行排序

按模型B对模型A进行排序,返回重复项

当使用$ project,$ frequency和$ group时,Mongoose按日期排序