2017-12-16 3 views
1

Es gibt wahrscheinlich einen einfachen Weg, dies zu tun, aber ich habe darüber eine Weile nachgedacht und gesucht und kann nicht scheinen, eine Antwort zu finden. Ich versuche im Grunde, die Ergebnisse zu begrenzen, aber mehr als das Limit einzuschließen, wenn die weitergehenden Zeilen nach dem Limit gleich sind. Zum Beispiel:Laravel Limit, aber zurück mehr als Limit wenn in der Spitze

Name  Score 
John  5 
Mike  4 
Lucy  3 
Sara  3 
Thea  2 

Wenn ich die Ergebnisse begrenzen wollte ich so etwas tun würde:

$topthree = Users::orderBy('score','desc')->limit(3)->get(); 

Das würde mir die drei besten Ergebnisse bekommen, aber wie würde ich auch Sara (von Beispieldaten), da sie auch in den ersten drei Punkten ist?

Ich habe überlegt, mehr als ich brauche und zusätzliche Filterung, aber ich nehme an, es gibt einen besseren Weg. Jede Hilfe wird geschätzt!

+0

Was willst du eigentlich? wenn du sara in dieser liste haben willst, gibt es hier nicht nur die drei wichtigsten logiken. Sie müssen also hier zusätzliche Logik haben. – Imran

+1

Kannst du es nicht einfach in zwei Schritten machen? 1) Holen Sie sich die Punktzahl der dritten, 2) Holen Sie alle Benutzer mit einer Punktzahl> = dazu. –

+0

Sie könnten versuchen, eine Abfrage wie folgt zu generieren: 'SELECT Name, Score von

WHERE Score> = (SELECT Score von (SELECT Score von
ORDER BY Score DESC) LIMIT 2,1);' – Cyclonecode

Antwort

1

Sie können versuchen, zwei Abfragen zu verwenden.

zuerst den 3. Platz Punktzahl:

$minScore = Users::orderBy('score','desc')->skip(2)->take(1)->value('score'); 

erhalten dann alle Benutzer erhalten mit mindestens die Partitur:

$topthree = Users::orderBy('score','desc')->where('score', '>=', $minScore)->get(); 

, die auch mit einer Unterabfrage funktionieren könnte:

$minScoreQuery = Users::select('score')->orderBy('score','desc')->skip(2)->take(1); 

$topthree = Users::orderBy('score','desc') 
    ->where('score', '>=', $minScoreQuery) 
    ->get();