具有多个左连接和计数的错误计算(Laravel)
Posted
技术标签:
【中文标题】具有多个左连接和计数的错误计算(Laravel)【英文标题】:Bad calculation with multiple left join and count (Laravel) 【发布时间】:2022-01-16 07:51:00 【问题描述】:我的数据库中有 3 个表(用户、付款和客户),我想要的是获取用户的所有新客户(在这样的日期范围内)和所有付款的总和(在这样的日期范围内)。但是计算是错误的,只有删除客户的左连接才能正常工作,但我需要在表格和我的尝试下方计算新客户:
表用户:
标识 |名字
餐桌付款
标识 | users_id |价格 |日期 ....
表客户
标识 | users_id |姓名 |厨具 | created_at ....
我的尝试:
$query = Payment::query();
->leftJoin('users', 'users.id', '=', 'payments.users_id')
->leftJoin('customers', 'customers.users_id', '=', 'payments.users_id')
->whereBetween('payments.date', [$request->value1 . " 00:00:00",$request->value5 . " 11:59:59"])
->whereBetween('customers.created_at', [$request->value1 . " 00:00:00",$request->value5 . " 11:59:59"])
->select(\DB::raw('SUM(payments.price) as total, count(customers.id) as total_customers))
->groupBy('payments.users_id');
return $query->paginate(env('ITEMS_PER_PAGE', 10));
因此,我需要该日期范围内的客户总和以及该日期范围内的付款总和,但按用户分组。但是,计算错误……
【问题讨论】:
怎么算错了?您能否提供样本输入、样本(不正确的)输出以及对正确输出的预期? 右边时间不应该是23:59:59吗? 我也想知道你为什么总是尝试左连接?因为无论是否有用户/客户,您都想要所有付款? @Psycho 我只能猜测,但可能付款与没有现有客户帐户的用户相关联。 【参考方案1】:>whereBetween('customers.created_at', [$request->value1 . " 00:00:00",$request->value5 . " 11:59:59"])
似乎不正确,因为您正在检查客户是否是在您指定的付款时间间隔内创建的。但是,由于较早的付款,客户很可能已经存在,并在搜索的时间间隔内支付了一些新产品/服务。看来这行应该去掉了。
如果可能有多个客户拥有相同的user_id
,那么在对结果进行分组之前,您将在结果中获得重复项,并且您将对不同的客户进行计数。一个可能的解决方法:
$query = Payment::query();
->leftJoin('users', 'users.id', '=', 'payments.users_id')
->leftJoin('customers', 'customers.users_id', '=', 'payments.users_id')
->whereBetween('payments.date', [$request->value1 . " 00:00:00",$request->value5 . " 23:59:59"])
->select(\DB::raw('SUM(payments.price) as total, count(customers.id) as total_customers))
->groupBy('payments.users_id');
return $query->paginate(env('ITEMS_PER_PAGE', 10));
如果同一用户可能有多个客户,那么您将需要进一步完善上述方法。
【讨论】:
右边时间不应该是23:59:59吗? 删除增加了在该日期范围内创建的计算和客户。 @Psycho 在我的回答中右侧时间是 23:59:59。第一个代码只是问题的引用,指出给定的行是不必要的。 对我不好,不知何故错过了我的眼睛:'( @Psycho 不用担心,我最初也错过了这一点,然后看到你对这个问题的出色评论......以上是关于具有多个左连接和计数的错误计算(Laravel)的主要内容,如果未能解决你的问题,请参考以下文章