我有一个包含用户列表的表(users
)。我有一个数据透视表(sign_in_out
),其中包含字段user_id
和signed_in
。我想获得一个所有用户列表,其中包含各自sign_in_out
行包含NULL
值的计数。
这就是我现在所拥有的:
$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
为NULL
的结果以及发生了多少次的count
但我想要返回所有用户,无论他们是否有任何匹配的行是sign_in_out
表。我知道WHERE signed_in IS NULL
正在弄清楚这一点,所以如何将其与主查询区分开来?
答案 0 :(得分:1)
想出来 - 在查询left join
表时查询应该使用sio
:
$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();