Php 获取laravel 5和mysql中groupby对象的第一个和最后一个值
我有一张叫做收入的桌子Php 获取laravel 5和mysql中groupby对象的第一个和最后一个值,php,mysql,laravel-5,Php,Mysql,Laravel 5,我有一张叫做收入的桌子 +----+-------------+---------------------+--------+--------+--------+-----------+---------------------+---------------------+ | id | employee_id | date | gross | income | credit | comission | created_at | updated_
+----+-------------+---------------------+--------+--------+--------+-----------+---------------------+---------------------+
| id | employee_id | date | gross | income | credit | comission | created_at | updated_at |
+----+-------------+---------------------+--------+--------+--------+-----------+---------------------+---------------------+
| 1 | 1 | 2016-03-30 19:21:09 | 100.00 | 29.00 | 11.00 | 60.00 | 2016-03-31 19:21:46 | 2016-03-31 19:21:46 |
| 2 | 1 | 2016-03-31 19:24:44 | 110.00 | 43.00 | 1.00 | 60.00 | 2016-03-31 19:24:56 | 2016-03-31 19:24:56 |
| 3 | 2 | 2016-03-31 21:44:09 | 77.00 | 30.80 | 0.00 | 60.00 | 2016-03-31 21:44:19 | 2016-03-31 21:44:19 |
+----+-------------+---------------------+--------+--------+--------+-----------+---------------------+---------------------+
我要做的是查询这些数据并按employee\u id
对其进行分组,然后我要它的开始日期和结束日期。我得到的是
$records = Income::whereBetween('date', [$start, $end])
->groupBy('employee_id')
->selectRaw('store_incomes.* , sum(gross) as total_gross , sum(income) as total_income, sum(credit) as total_credit')
->get();
这始终返回该员工的第一个日期。例如,employee_id 1
始终返回日期2016-03-30 19:21:09
。我想要的是为每个员工id
获取第一个和最后一个日期,因此员工id 1
的开始日期为2016-30-30
,结束日期为2016-03-31
。有没有一种方法可以做到这一点而不需要混乱的手动代码
对于当前代码,我的输出是:
[
{"id":"1","employee_id":"1","date":"2016-03-30 19:21:09","gross":"100.00","income":"29.00","credit":"11.00","comission":"60.00","created_at":"2016-03-31 19:21:46","updated_at":"2016-03-31 19:21:46","total_gross":"210.00","total_income":"72.00","total_credit":"12.00"},
{"id":"3","employee_id":"2","date":"2016-03-31 21:44:09","gross":"77.00","income":"30.80","credit":"0.00","comission":"60.00","created_at":"2016-03-31 21:44:19","updated_at":"2016-03-31 21:44:19","total_gross":"77.00","total_income":"30.80","total_credit":"0.00"}
]
我的预期输出包括另外两个值(start\u date
和end\u date
):
您需要的原始MySQL查询大致如下:
SELECT MIN(date) AS start_date, MAX(date) AS end_date, store_incomes.*,
SUM(gross) AS total_gross , SUM(income) AS total_income, SUM(credit) AS total_credit
FROM income
GROUP BY employee_id
要在Laravel中执行此操作,只需在原始查询中添加MIN()
和MAX()
:
$records = DB::Income
->selectRaw('store_incomes.* , min(date) as start_date, max(date) as end_date, sum(gross) as total_gross , sum(income) as total_income, sum(credit) as total_credit')
->groupBy('employee_id')
->get();
向我们展示您的预期输出。感谢您的评论。我已编辑以包含所需的输出。只是想知道我是否可以在selectRaw中实现这一点?您是只想要日期还是想要其他信息?如果有两个日期,您的聚合可能没有意义。因为我可能会说3个员工id,然后说我想显示从2月到4月的记录。当我查询时,我希望我的结果按每个员工分组,每个员工在开始日期和结束日期之间的收入。但是,并非所有员工都在同一日期开始,并在同一日期结束。因此,我必须显示每个员工的开始和结束日期。
在两者之间('date',[$start,$end])的目的是什么
那么,如果您为每个员工取最小和最大日期?
$records = DB::Income
->selectRaw('store_incomes.* , min(date) as start_date, max(date) as end_date, sum(gross) as total_gross , sum(income) as total_income, sum(credit) as total_credit')
->groupBy('employee_id')
->get();