leftJoin没有得到LEFT表中的所有行

时间:2015-08-01 12:25:23

标签: sql laravel-4 eloquent

我有以下查询

#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();

由于

2 个答案:

答案 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