2016-11-03 14 views
1

Welche Laravel-Abfrage würde ich verwenden, um groupBy ('author_id'), sondern das neueste Ergebnis. Im Moment zieht alles, was ich versuche, das erste Ergebnis. Ich habe mit MAX versucht (id) als id SQL-Funktion, aber ohne GlückWie gruppiere ich den letzten Datensatz in der Gruppe

es den Rekord ok findet, findet nur den ersten Datensatz in der Gruppe

Hier ist meine Modell-Abfrage, die ich benutze:

public function lastMessages() { 
    return $this->hasMany('App\Message', 'recipient_id')->groupBy('author_id')->orderBy('created_at', 'DESC'); 
} 

ich habe auch versucht:

public function lastMessages() { 
    return $this->hasMany('App\Message', 'recipient_id') 
     ->select(DB::raw('*, max(id) as id)) 
     ->groupBy('author_id') 
     ->orderBy('id', 'desc'); 
} 

ich auch dieses und kein Glück versucht:

public function lastMessages() { 
    return $this->hasMany('App\Message', 'recipient_id') 
     ->select(DB::raw('*, max(created_at) as created_at)) 
     ->groupBy('author_id') 
     ->orderBy('created_at', 'desc'); 
} 

Alle oben genannten werden die erste Zeile der Gruppe author_id zurückgeben. Ich möchte die letzte Zeile jeder Gruppe oder die letzte Zeile zurückgeben. Ich habe auch versucht -> neuste() und keine Würfel!

Vielen Dank im Voraus für die Hilfe.

My Table:

id project_id author_id Nachricht created_at updated_at

+0

Es kann hilfreich sein, wenn Sie einige Beispieldaten zusammen mit der gewünschten Ausgabe anzeigen. –

Antwort

1

erstellen recipient_id beitreten eine Unterabfrage, dass jeder von nicht mehr Autor neueste Nachrichten-ID auf diese Weise Gruppe bekommt, wird sein müssen, da Sie erhalten bereits die letzte Nachrichten-ID jedes Autors in Ihrer Join-Unterabfrage

max (erstellt) ist nicht mehr erforderlich, weil Sie bereits erhalten ting die neueste

in jeder Gruppe erstellt Nachricht
public function lastMessages() { 
    return $this->hasMany('App\Message', 'recipient_id') 
     ->select('*') 
     ->join(DB::raw('(Select max(id) as id from messages group by author_id) LatestMessage'), function($join) { 
      $join->on('messages.id', '=', 'LatestMessage.id'); 
      }) 
     ->orderBy('created_at', 'desc'); 
} 

Screen Shot

+0

OMG !! Danke, ich habe mir in den letzten 4 Stunden den Kopf gestoßen. Ich habe eine andere Lösung gefunden, ohne den Join zu benutzen. Ich poste die Antwort auch – max234435

0

Nach stundenlang an diesem Kopf hämmern und einige Eingabe aus diesem Forum, bekam ich das, was mich auch mit einem gewünschten Ergebnis liefert.

public function lastMessages() { 
    return $this->hasMany('App\Message', 'recipient_id') 
     ->select('*') 
     ->whereIn('id', function($q){ 
      $q->select(DB::raw('MAX(id) FROM messages GROUP BY author_id')); 
     }); 
} 
+0

yep, aber diese ist langsamer, weil Sie diese Unterabfrage in jeder Zeile aufrufen – Beginner

+0

Wie messen Sie die Geschwindigkeit der Abfrage? Ich bin nicht der beste, wenn es darum geht, sql – max234435

+0

Just vor Erklären Sie vor Ihrer Frage – Beginner

Verwandte Themen