2017-12-29 50 views
0

여러 개의 방문자가있는 테이블이 있습니다. 내 결과 목록에는 각 방문자의 마지막 방문 만 표시되어야합니다. 나는 각 방문자가 한 번에 표시됩니다 같은Eloquent Laravel로 두 개의 쿼리를 중첩하는 방법

->orderBy('visitors.created_at', 'desc') 
->groupBy('visitors.descr') 

결과 목록이 올바른지 할 경우

id | created_at | descr | website | source 
------------------------------------------ 
2 | 2017_12_22 | john | john1.com | a 
3 | 2017_12_23 | marc | ssdff.com | b 
4 | 2017_12_24 | john | john1.com | c 
5 | 2017_12_24 | tina | def.com | b 
6 | 2017_12_25 | stef | abc.com | a 
7 | 2017_12_26 | john | john2.com | c 

:

테이블처럼 보인다. 그러나 나는 방문자의 최신 발생을 필요로하고 결과 목록은 첫 번째 발생을 보여줍니다.

select * 
from visitors as v 
INNER JOIN (select descr , MAX(created_at) as max_created 
from visitors as v 
group by descr) AS M 
where v.descr = M.descr AND v.created_at = M.max_created 
ORDER BY created_at DESC 

누군가가 설득력이 점을 얻거나 나를 다른 방향으로 얻을 수 있도록 수 : 그래서 그 대신 ID 2의 나는 ID 7

다음 쿼리는 그 문제를 해결보고 싶은데요?

+0

작동하지 않는 (역전 된) Eloquent 쿼리를 게시 할 수 있습니까? – Laerte

답변

0

당신은 AUTO_INCREMENT id 열을 사용하는 대신 created_at 할 수있는 경우 다른 방법을 사용하여 동일한 결과를 얻을 수 있습니다.

select * 
from visitors 
where id in (
    select MAX(id) 
    from visitors 
    group by descr 
) 
ORDER BY id DESC 

이 쿼리는 효율성이 떨어지지 만 whereIn()은 하위 쿼리를 지원하므로 웅변으로 사용하는 것이 더 쉽습니다. created_at의 값이 같은 경우 원래 쿼리, descr 당 여러 행을 반환 할 수 있습니다

$subQuery = Visitor::groupBy('descr')->select(DB::raw('max(id)')); 
$latestVisitors = Visitor::whereIn('id', $subQuery)->orderBy('id', 'desc')->get(); 

참고. 고유하므로이 값은 id을 사용하여 발생할 수 없습니다.

+0

좋은 방법은 그것을 해결할 수 있습니다. 폴 감사합니다! –

0

왜 그냥 다음과 같이 SQL을 직접 조회 해달라고 : 웅변에서

DB::table('visitors')->select(" 
    select * 
    from visitors as v 
    INNER JOIN (select descr , MAX(created_at) as max_created 
    from visitors as v 
    group by descr) AS M 
    where v.descr = M.descr AND v.created_at = M.max_created 
    ORDER BY created_at DESC 
"); 

를 쿼리가이 같은 것입니다 :

DB::table('visitors as v') 
->join(DB::raw("(select descr , MAX(created_at) as max_created 
from visitors as v 
group by descr) AS M "),'v.id','=','M.id') 
->select('*') 
->where('v.descr','M.descr')->where('v.created_at','M.max_created') 
->orderBy('created_at','desc') 
->get() 
0

당신은 당신의 방문자 모델

public function lastVisit() 
{ 
    $this->hasOne('VisitModel')->latest(); 
} 

에 도우미 관계를 작성하고 다음 정말 모든 그것에가있어 자신의 마지막 방문

$visitors = Visitor::with('lastVisit')->get(); 

모든 방문자를 가져올 수 있습니다.