具有多个左连接和计数的错误计算(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)的主要内容,如果未能解决你的问题,请参考以下文章

mysql 查询 - 使用左连接和 where 子句的多个计数

PostgreSQL - 带有错误计数输出的左连接

具有 Linq 和默认值的多个左连接

Linq to Entity 具有多个左外连接

查询生成器 Laravel 左连接

显示具有多个需要累积的值的左连接