2014-08-30 63 views
1

我有一個用戶列表(users)的表。我有一個數據透視表(sign_in_out),其字段爲user_idsigned_in。我想獲得一個列表所有用戶與他們各自的計數有多少sign_in_out行包含NULL值。Laravel mysql選擇加入表的計數

這是我現在有:

$publishers = Sentry::getUserProvider() 
    ->createModel() 
    ->select('users.id', 'users.first_name', 'users.last_name', 'sio.sign_in_count') 
    ->join('users_groups', 'users.id', '=', 'users_groups.user_id') 
    ->join(DB::raw('(
     SELECT user_id, COUNT(*) sign_in_count 
     FROM sign_in_out 
     WHERE signed_in IS NULL 
     GROUP BY user_id) sio'), function($join) 
    { 
     $join->on('users.id', '=', 'sio.user_id'); 
    }) 
    ->where('users_groups.group_id', '=', 2) 
    ->orderBy('users.last_name', 'ASC') 
    ->orderBy('users.first_name', 'ASC') 
    ->get(); 

這隻返回結果,其中signed_in是它多少次發生count沿NULL,但我想回到所有用戶,無論他們是否有任何匹配或不在sign_in_out表中的行。我知道WHERE signed_in IS NULL是這樣的,所以我如何從主查詢中分離出來?

回答

1

想通了 - 查詢sio表查詢時應該已經使用left join

$publishers = Sentry::getUserProvider() 
    ->createModel() 
    ->select('users.id', 'users.first_name', 'users.last_name', 'sio.sign_in_count') 
    ->join('users_groups', 'users.id', '=', 'users_groups.user_id') 
    ->leftJoin(DB::raw('(
     SELECT user_id, COUNT(*) sign_in_count 
     FROM sign_in_out 
     WHERE signed_in IS NULL 
     GROUP BY user_id) sio'), function($join) 
    { 
     $join->on('users.id', '=', 'sio.user_id'); 
    }) 
    ->where('users_groups.group_id', '=', 2) 
    ->orderBy('users.last_name', 'ASC') 
    ->orderBy('users.first_name', 'ASC') 
    ->get();