Я пытаюсь сделать левое соединение, используя две таблицы, где мне нужно сначала получить все идентификатор пользователя и имя, которое удовлетворяет условию и общему количеству строк во второй таблице для каждого пользователя. Если у пользователя нет строки во второй таблице, она должна быть нулевой или нулевой.
Это мой красноречивый запрос.
$users->where('users.access_type', '=', 'type1')->orwhere('users.access_type', '=', 'type2')
->leftJoin(DB::raw("(SELECT user_id, COUNT(*) as count FROM table2 WHERE date > '2014-09-17 16:30:04' GROUP BY user_id) temp_table"), function($leftJoin) {
$leftJoin->on('temp_table.user_id', '=', 'users.user_id');
})->select(DB::raw('users.user_id, users.name, temp_table.count as count'))->orderBy('count')->get();
который не возвращает пользователя с нулевым значением счетчика. вместо этого он возвращает пользователя с наименьшим количеством. Я распечатал журнал запросов и скопировал необработанный запрос для вышеупомянутого запроса, заполнил значения и выполнил. который работает отлично, а также возвращает пользователя с нулевыми записями. Никаких изменений, внесенных в запрос, полученный из журнала запросов, кроме добавления значений. Копирование необработанного запроса ниже.
select users.user_id, users.name, temp_table.count as count from `users` left join (SELECT user_id, COUNT(*) as count FROM table2 WHERE date > '2014-09-17 16:30:04' GROUP BY user_id) temp_table on `temp_table`.`user_id` = `users`.`user_id` where `users`.`access_type` = 'type1' or `users`.`access_type` = 'type2' order by `count` asc
Я попытался изменить имя столбца поля user_id для обоих, используя as user
, Также пытается заменить нулевые значения на ноль, используя IFNULL
, Но все равно не идти. Пожалуйста, дайте мне знать, что я делаю не так.
В вашем Eloquent запросе вам нужно заменить последний вызов функции ...->first()
от ...->get()
чтобы получить все результаты, а не только первый.
Других решений пока нет …