当前位置: 首页 > 知识库问答 >
问题:

laravel在groupBy之后使用计数/求和方法

马煌
2023-03-14

当我使用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.pay日志表

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支付日志talbe数据

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:如果使用雄辩的ORM

修改-



测试示例(放弃)

>

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

测试数据

在hc_成员(id、名称、金额)中插入值(1,'aaa',10.00),(2,'bbb',10.00),(3,'ccc',10.00)

测试结果

我希望,当我使用方法Member::groupBy('name')时-

我想要结果3

实际上它返回1。


当我使用方法Member::groupBy('name')时-

我要30点的结果

实际上它返回10.00



谢谢你的回答,帮我解决了这个问题!


共有1个答案

丌官玺
2023-03-14

这不是laravel的问题,因为Member::groupBy('id'))-

尝试运行此查询

SELECT COUNT(*) AS aggregate FROM members GROUP BY 'id'

它将返回每个(id)聚合的行数计数。这是在调用Member::groupBy('id')时执行的查询-

如果您需要不同ID的计数,可以调用

Member::distinct('id')->count('id')

这与sum查询也返回10的原因相同。查询返回具有相同“名称”的组的“金额”之和。

要获得所有金额的总和,只需调用,

Member::sum('amount');

 类似资料:
  • 我必须根据以下col1、col2和loc的数据进行分组,并计算col3中的项数。此外,还应考虑开始和结束日期,即日期应在2021 1月1日至2021 1月31日之间。最终结果应显示在col4中。 数据 预期输出

  • 我想通过聊天Id获得用户和组之间的聊天次数。但查询没有给出聊天次数。它是空白的。我在堆栈溢出(Laravel Elount groupBy()和count,Laravel get count of results Basin groupBy)中也看到过类似的问题,并使用了那些标记为正确但仍然没有得到所需结果的查询。 我使用以下查询: 我的表格结构如下: 结果是这样的: )

  • 我想使用Laravel Eloquent完成任务。我在网上搜索过,没有找到任何有说服力的东西。有些人将groupBy()查询与查询生成器一起使用,如以下链接 但是我想创建这样的查询风格: 此代码仅返回第一个的计数。但是我要计算所有的。

  • 问题内容: 使用样本数据: df 我试图弄清楚如何按key1分组数据并仅对key2等于“ one”的data1值求和。 这是我尝试过的 但这给了我一个数值为“无”的数据框 这里有什么想法吗?我正在寻找与以下SQL等效的Pandas: 提前致谢 问题答案: 首先按key1列分组: 然后为每个组取subDataFrame,其中key2等于“ one”并求和data1列: 为了解释发生了什么,让我们看一

  • 本文向大家介绍pandas数据分组groupby()和统计函数agg()的使用,包括了pandas数据分组groupby()和统计函数agg()的使用的使用技巧和注意事项,需要的朋友参考一下 数据分组 使用 groupby() 方法进行分组 group.size()查看分组后每组的数量 group.groups 查看分组情况 group.get_group('名字') 根据分组后的名字选择分组数据

  • 问题内容: 例如,我有下表: 分组后: 我需要的是删除每个组中的行,其中列中的数量小于组中column的所有行中的最大值。好吧,我在将这个问题翻译和表达为英语时遇到了问题,因此这里是示例: 组中列中的行的最大值: 8 所以我想删除带有索引的行,并保留带有索引的行, 组中列中的行的最大值: 5 所以我想删除带有索引的行并保留带有索引的行 我尝试使用熊猫过滤器功能,但是问题是它一次在组中的所有行上运行