2014-09-23 6 views
0

두 테이블을 사용하여 왼쪽 조인을 수행하려고합니다. 각 사용자에 대해 두 번째 테이블의 조건과 전체 행 수를 충족시키는 모든 사용자 ID와 이름을 먼저 얻어야합니다. 사용자가 두 번째 테이블에 행이 없으면 널 또는 0이어야합니다.자세히 알아보기

이것은 훌륭한 검색어입니다.

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

null 카운트 값을 가진 사용자를 반환하지 않습니다. 대신 최소한의 수를 가진 사용자를 반환합니다. 쿼리 로그를 인쇄하고 위 쿼리에 대한 원시 쿼리를 복사하고 값을 채우고 실행했습니다. 완벽하게 작동하며 null 항목이있는 사용자를 반환합니다. 값을 추가하는 것 외에는 u 리 로그에서 얻은 u 리가 변경되지 않습니다. 아래 원시 쿼리 복사.

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 

내가 모두 as user를 사용하기위한 USER_ID 필드의 열 이름을 변경 시도했다. 또한 IFNULL을 사용하여 널 값을 0으로 바꾸려고합니다. 그러나 여전히가 없습니다. 내가 뭘 잘못하고 있는지 알려줘.

답변

0

Eloquent 쿼리에서 ...->get()으로 마지막 함수 호출 ...->first()을 바꿔야 첫 번째 결과 만 검색하는 대신 모든 결과를 검색해야합니다.

+0

은 중요하지 않습니다. 첫 번째 배열 만 반환해야하기 때문에'-> first()'를 사용했습니다. 어쨌든, 나는 질문을 업데이 트했습니다. –

+0

'first()'를 사용하면 첫 번째 쿼리 결과 만 반환되므로 결과가'count'로 정렬되므로 사용자가 한 명, 즉 가장 적은 수의 사용자 만 얻는 이유가 설명됩니다. 'get()'을 사용하면 쿼리에서 반환 된 모든 사용자가 반환됩니다. 또한 '첫 번째'가 Laravel에 의해 수행되고 데이터베이스 쿼리 자체에 있지 않기 때문에 쿼리 로그에서 쿼리를 복사 할 때 왜 쿼리가 작동하는지 설명합니다. – lowerends

+0

'first()'또는'get()'은 null 값을 가진 엔트리를 반환하지 않습니다. 둘 다 null을 제외하고 최소값을 반환합니다. 나는 도움이 필요하다. 그들 사이의 차이는 아닙니다. 그것들은 자명하다. 시도해 주셔서 감사합니다. –

관련 문제