2017-12-29 64 views
0

私は、複数の訪問者を持つテーブルを持っています。私の結果リストには、各訪問者の最終訪問のみが表示されます。Eloquent Laravelで2つのクエリをネストする方法

の表は、次のようになります。

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 

私は

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

を行う場合のみ、各訪問者が一度示されているように、結果のリストが正しいです。しかし、私は訪問者の最新の出現を必要とし、結果リストは最初の出現を示します。だからではなく、ID 2の私はID 7

は、次のクエリは、その問題を解決してほしい:

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 

誰かが雄弁にこれを取得したり、別の方向に私を得るのを助けるだろうか?

+0

動作していない(反転している)Eloquentクエリを投稿できますか? – Laerte

答えて

0

別の方法で(同じ)結果を得ることができます:

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

whereIn()はサブクエリをサポートしているため、このクエリはおそらく効率が悪いですが、雄弁に使用する方が簡単です。

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

created_atの値が同じであれば、あなたの元のクエリは、descrごとに複数の行を返すことができることに注意してください。これは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 
"); 

クエリはこのようなものになるだろう:あなたはAUTO_INCREMENT id列の代わりcreated_atを使用できる場合

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

ですべての訪問者を取得することができます。

関連する問題