当我使用count
或sum
方法时,我得到了错误的结果。
例如:
Member::groupBy('id')->count()
我只在另一种方法中获得结果1
Member::count()
我得到了正确的结果。
使用sum
方法时,我得到错误的结果。
https://github.com/laravel/framework/issues/14123
忘了说,我的laravel版本信息:
Laravel Framework version 5.1.40 (LTS)
项目中的实际问题
我有充值日志表。
1.pay log table
CREATE TABLE pay_logs (
id int(11) NOT NULL AUTO_INCREMENT,
amount decimal(20,2) DEFAULT '0.00',
pay_sn varchar(20) DEFAULT NULL,
join_date int(11) unsigned DEFAULT '0',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
1.1支付日志数据
INSERT INTO pay_logs (id, amount, pay_sn, join_date)
VALUES
(1,10.00,'aabbcc',1466753291),
(2,10.00,'aabbcc',1466753292),
(3,20.00,'bbccdd',1466753292),
(4,30.00,'ccddee',1466753292);
4.产品说明
在pay_log表中,1和2记录相同。所以当想要按实际充值成功时间过滤结果时,我只需要一条记录,所以我使用groupBy操作。
我的错误操作
DB::table('pay_log')
->whereBetween('joinDate',[$beginToday,$endToday])
->where('isSucceed','=',1)
->where('type','=',1)
->groupBy('pay_sn');
->count();
最后,解决它。
$query = DB::table('pay_log')
->select(DB::raw('count(*) as num'))
->whereBetween('joinDate',[$beginToday,$endToday])
->where('isSucceed','=',1)
->where('type','=',1)
->groupBy('pay_sn');
ps:如果使用Eloquent ORM
将->mergeBindings($query)
修改为->mergeBindings($query->getQuery())
测试示例( discard )
create table sql
CREATE TABLE members (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(15) DEFAULT NULL,
amount decimal(20,2) DEFAULT '0.00',
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
测试数据
INSERT INTO hc_members (id, name, amount) VALUES
(1,'aaa',10.00),
(2,'bbb',10.00),
(3,'ccc',10.00);
测试结果
我希望,当我使用方法Member::groupBy('name')->count()
我想结果3
实际上返回1 。
当我使用方法Member::groupBy('name')->sum('amount')
我想结果30.00
实际上返回10.00
感谢您的回答,帮助我解决问题!
答案 0 :(得分:3)
这不是laravel的问题,因为Member::groupBy('id')->count()
将返回每个ID的结果数量计数。 (Laravel只返回查询结果的第一行。)
尝试运行此查询
SELECT COUNT(*) AS aggregate FROM members GROUP BY 'id'
它将返回每个(id)聚合的行数。这是当您调用Member::groupBy('id')->count()
时执行的查询,而laravel只需要一行,返回第一个聚合的计数。
如果您想要计算不同的ID,可以调用
Member::distinct('id')->count('id')
这与您的求和查询也返回10的原因相同。查询返回' amount'的总和。对于具有相同'名称'。
的群组要获得所有金额的总和,只需致电,
Member::sum('amount');