使用查询构建器和使用原始查询获取不同的记录 laravel 不同
Getting distinct records laravel using query builder and using raw query differs
Laravel 5.6.29
PHP7.3.5
App\StatusAudit::where('user_id', 39)->where('new_status', 4)->whereBetween(
'created_at', [\Carbon\Carbon::parse('22-05-2019')->toDateString(), \Carbon\Carbon::parse('22-06
-2019')->toDateString()])->distinct()->count()
给出结果 31,status_audits.id 不同所以 31,正确,但是 ->distinct('video_id')
给出 31 很有趣!并使用 groupBy
给我 1.
和
SELECT COUNT( DISTINCT status_audits.video_id) FROM status_audits WHERE user_id = 39 AND new_status = 4 AND DATE(created_at) BETWEEN "2019-05-22" AND "2019-06-22"
正在给 30
为什么结果 30 和 31 不同?
Tinker 结果
>>> App\StatusAudit::where('user_id', 39)->where('new_status', 4)->whereBetween(
'created_at', [\Carbon\Carbon::parse('22-05-2019')->toDateString(), \Carbon\Carb
on::parse('22-06-2019')->toDateString()])->distinct('video_id')->count()
=> 31
>>> App\StatusAudit::where('user_id', 39)->where('new_status', 4)->whereBetween(
'created_at', [\Carbon\Carbon::createFromFormat('d-m-Y', '22-05-2019'), \Carbon\
Carbon::createFromFormat('d-m-Y', '22-06-2019')])->distinct('video_id')->count()
=> 28
>>> App\StatusAudit::where('user_id', 39)->where('new_status', 4)->whereBetween(
'created_at', [\Carbon\Carbon::createFromFormat('d-m-Y', '22-05-2019')->toDateSt
ring(), \Carbon\Carbon::createFromFormat('d-m-Y', '22-06-2019')->toDateString()]
)->distinct('video_id')->count()
=> 31
分组结果
$ php artisan tinker
Psy Shell v0.9.9 (PHP 7.3.5 — cli) by Justin Hileman
>>> App\StatusAudit::where('user_id', 39)->where('new_status', 4)->whereBetween(
'created_at', [\Carbon\Carbon::createFromFormat('d-m-Y', '22-05-2019')->toDateSt
ring(), \Carbon\Carbon::createFromFormat('d-m-Y', '22-06-2019')->toDateString()]
)->groupBy('video_id')->count()
=> 1
更新
收集和计算唯一记录的效率不高,但这是一种解决方法
>>> App\StatusAudit::where('user_id', 39)->where('new_status', 4)->whereBetween(
'created_at', [\Carbon\Carbon::parse('22-05-2019')->toDateString(), \Carbon\Carb
on::parse('22-06-2019')->toDateString()])->get()->unique('video_id')->count()
=> 30
另一种解决方法是
>>> App\StatusAudit::where('user_id', 39)->where('new_status', 4)->whereBetween(
'created_at', [\Carbon\Carbon::createFromFormat('d-m-Y', '22-05-2019')->toDateSt
ring(), \Carbon\Carbon::createFromFormat('d-m-Y', '22-06-2019')->toDateString()]
)->distinct()->pluck('video_id')->count()
你在调用 Carbon::parse
时的日期字面意思让我失望。尝试使用 ISO 格式:
App\StatusAudit::where('user_id', 39)
->where('new_status', 4)
->whereBetween('created_at', [\Carbon\Carbon::parse('2019-05-22'),
\Carbon\Carbon::parse('2019-06-22')])
->distinct()
->count();
如果您想对日期字符串使用 dd/mm/YYYY
格式,那么您可能必须使用如下格式:
$date = Carbon\Carbon::createFromFormat('d-m-Y', '22-05-2019);
distinct()
方法不接受任何参数:https://laravel.com/api/5.6/Illuminate/Database/Query/Builder.html#method_distinct。您的手写 SQL 查询计算的是不同的 status_audits.video_id
,但您的查询构建器代码计算的是不同的行。
您可以将列名传递给 count()
方法以仅计算来自该列的不同值。
App\StatusAudit::where('user_id', 39)->where('new_status', 4)->whereBetween(
'created_at', [\Carbon\Carbon::parse('22-05-2019')->toDateString(), \Carbon\Carbon::parse('22-06
-2019')->toDateString()])->distinct()->count('video_id')
Laravel 5.6.29 PHP7.3.5
App\StatusAudit::where('user_id', 39)->where('new_status', 4)->whereBetween(
'created_at', [\Carbon\Carbon::parse('22-05-2019')->toDateString(), \Carbon\Carbon::parse('22-06
-2019')->toDateString()])->distinct()->count()
给出结果 31,status_audits.id 不同所以 31,正确,但是 ->distinct('video_id')
给出 31 很有趣!并使用 groupBy
给我 1.
和
SELECT COUNT( DISTINCT status_audits.video_id) FROM status_audits WHERE user_id = 39 AND new_status = 4 AND DATE(created_at) BETWEEN "2019-05-22" AND "2019-06-22"
正在给 30
为什么结果 30 和 31 不同?
Tinker 结果
>>> App\StatusAudit::where('user_id', 39)->where('new_status', 4)->whereBetween(
'created_at', [\Carbon\Carbon::parse('22-05-2019')->toDateString(), \Carbon\Carb
on::parse('22-06-2019')->toDateString()])->distinct('video_id')->count()
=> 31
>>> App\StatusAudit::where('user_id', 39)->where('new_status', 4)->whereBetween(
'created_at', [\Carbon\Carbon::createFromFormat('d-m-Y', '22-05-2019'), \Carbon\
Carbon::createFromFormat('d-m-Y', '22-06-2019')])->distinct('video_id')->count()
=> 28
>>> App\StatusAudit::where('user_id', 39)->where('new_status', 4)->whereBetween(
'created_at', [\Carbon\Carbon::createFromFormat('d-m-Y', '22-05-2019')->toDateSt
ring(), \Carbon\Carbon::createFromFormat('d-m-Y', '22-06-2019')->toDateString()]
)->distinct('video_id')->count()
=> 31
分组结果
$ php artisan tinker
Psy Shell v0.9.9 (PHP 7.3.5 — cli) by Justin Hileman
>>> App\StatusAudit::where('user_id', 39)->where('new_status', 4)->whereBetween(
'created_at', [\Carbon\Carbon::createFromFormat('d-m-Y', '22-05-2019')->toDateSt
ring(), \Carbon\Carbon::createFromFormat('d-m-Y', '22-06-2019')->toDateString()]
)->groupBy('video_id')->count()
=> 1
更新 收集和计算唯一记录的效率不高,但这是一种解决方法
>>> App\StatusAudit::where('user_id', 39)->where('new_status', 4)->whereBetween(
'created_at', [\Carbon\Carbon::parse('22-05-2019')->toDateString(), \Carbon\Carb
on::parse('22-06-2019')->toDateString()])->get()->unique('video_id')->count()
=> 30
另一种解决方法是
>>> App\StatusAudit::where('user_id', 39)->where('new_status', 4)->whereBetween(
'created_at', [\Carbon\Carbon::createFromFormat('d-m-Y', '22-05-2019')->toDateSt
ring(), \Carbon\Carbon::createFromFormat('d-m-Y', '22-06-2019')->toDateString()]
)->distinct()->pluck('video_id')->count()
你在调用 Carbon::parse
时的日期字面意思让我失望。尝试使用 ISO 格式:
App\StatusAudit::where('user_id', 39)
->where('new_status', 4)
->whereBetween('created_at', [\Carbon\Carbon::parse('2019-05-22'),
\Carbon\Carbon::parse('2019-06-22')])
->distinct()
->count();
如果您想对日期字符串使用 dd/mm/YYYY
格式,那么您可能必须使用如下格式:
$date = Carbon\Carbon::createFromFormat('d-m-Y', '22-05-2019);
distinct()
方法不接受任何参数:https://laravel.com/api/5.6/Illuminate/Database/Query/Builder.html#method_distinct。您的手写 SQL 查询计算的是不同的 status_audits.video_id
,但您的查询构建器代码计算的是不同的行。
您可以将列名传递给 count()
方法以仅计算来自该列的不同值。
App\StatusAudit::where('user_id', 39)->where('new_status', 4)->whereBetween(
'created_at', [\Carbon\Carbon::parse('22-05-2019')->toDateString(), \Carbon\Carbon::parse('22-06
-2019')->toDateString()])->distinct()->count('video_id')