返回按日期排序的数据
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 的字段或关联