我有以下查询
#Query 1
$count = User::where('users.status', '=', 1)
->leftJoin('deposits', 'users.id', '=', 'deposits.user_id')
->select('users.*')
->groupBy('deposits.user_id')
->count();
# Count == 71
# Query 2
User::where('users.status', '=', 1)->count()
# Count == 89
请问为什么我没有收到用户表中的所有行?
Ultmately,我想运行以下查询
$resellers = User::where('users.status', '=', UserStatus::getUserStatusAsInteger('reseller') )
->leftJoin('deposits', 'users.id', '=', 'deposits.user_id')
->where('deposits.status', '=', 'completed')
->where('deposits.created_at', '>=', \Carbon\Carbon::now()->subDays(25) )
->having( DB::raw( 'sum( deposits.amount )') , '<', Settings::first()->min_reseller_deposit )
->select('users.*', DB::raw( 'sum( deposits.amount ) as `total_deposits`' ))
->groupBy('users.id')
->get();
由于
答案 0 :(得分:1)
即使您left join
在表上,仍然使用join
条件,查询将返回仅满足条件的行。由于right
表中没有与条件不匹配的行,因此您不会看到null
值显示。
答案 1 :(得分:0)
在您的第一个查询中,您未获取所有行的原因是因为您按deposits.user_id
进行分组,这对所有用户都不存在。
->groupBy('deposits.user_id')
相反,您应该按users.id
在第二个查询中,您未获得左表中所有行的原因是因为您在deposits
子句中引用了正确的表where
,这意味着只要deposits
上没有匹配项,这些值就会为空,而where
会失败。
解决方案是将where
的{{1}}条件移到deposits
left join