在groupBy之后使用count/sum方法


laravel use count/sum method after groupBy

当我使用countsum方法时,我得到了错误的结果。

例如:

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: if use Eloquent ORM

修改->mergeBindings($query)->mergeBindings($query->getQuery())



测试例子(丢弃)

    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;

  1. 测试数据

    INSERT INTO hc_members (id, name, amount) VALUES (1,'aaa',10.00), (2,'bbb',10.00), (3,'ccc',10.00);

  2. 测试结果

在我的希望,当我使用方法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');