当我使用count
或sum
方法时,我得到了错误的结果。
Member::groupBy('id')->count()
我只得到结果1,在另一个方法
Member::count()
我得到正确的结果。
我得到错误的结果时,使用sum
方法。
忘了说,我的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: if use Eloquent ORM
修改->mergeBindings($query)
为->mergeBindings($query->getQuery())
测试例子(丢弃)
-
create table sql
测试数据
INSERT INTO hc_members (id, name, amount) VALUES (1,'aaa',10.00), (2,'bbb',10.00), (3,'ccc',10.00);
测试结果
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;
在我的希望,当我使用方法Member::groupBy('name')->count()
I want result 3
实际上它返回1
当我使用Member::groupBy('name')->sum('amount')
I want result 30.00
实际上它返回10.00
谢谢你的回答,帮我解决问题!
这不是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')
这与sum查询返回10的原因相同。查询返回具有相同"name"的组的"amount"的总和。
要获取所有金额的总和,只需调用
Member::sum('amount');