【发布时间】:2016-10-26 14:10:50
【问题描述】:
当我使用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.支付日志表
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);
2.描述
在 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())
测试示例(丢弃)
-
创建表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
感谢您的回答帮助我解决问题!
【问题讨论】:
-
为什么不使用
count(Member::groupBy('id')->get())? -
因为
Illuminate\Database\Eloquent\Collection提供->count()是出于特定原因。 -
@Ohgodwhy 但是与
groupBy()结合使用时似乎并没有给出正确的结果 -
@aldrin27 谢谢你的回答。正如你所说,我可以使用你的方法(但我得到 500 错误,可能内存不足,获取太多数据,我认为没有必要,我只需要获取它有多少记录)我有同样的问题 @987654342 @方法,我该如何解决。
-
@Uchiha 我已经编辑了我的描述。
标签: php laravel count group-by sum