2016-07-12 11 views
0

Ich weiß, wie man COUNT findet, AVG Funktionen funktioniert wollen Ich versuche hier zu erreichen ist eine andere Operation, nachdem die Zählung gefunden wurde, siehe meinen Code unten.Schnellste Möglichkeit, die Anzahl ausgewählter Objekte in MySql zu finden?

Article::where('id','=',130) 
      ->select(
       'articles.*', 
       DB::raw('(SELECT avg(rating) FROM rating WHERE rateable_id = articles.id AND type = "article" ) as avgRating'), 
       DB::raw('(SELECT count(*) FROM comments WHERE commentable_id = articles.id AND commentable_type = "article") as commentCount'), 
       DB::raw('(SELECT count(*) FROM article_favourites WHERE article_id = articles.id) as favouriteCount') 
      ) 
      ->get(); 

die obige Abfrage verwenden, kann ich 'avgRating', 'commentCount' get 'favouriteCount', aber ich möchte auch die Summe dieser drei .. also etwas bekommen, wie:

(avgRating + commentCount + favouriteCount) AS Sum

Was ist der beste Weg, dies zu tun? PS: Ich habe bereits eine Lösung

DB::raw('((SELECT avg(rating) FROM rating WHERE rateable_id = article.id AND type = "article")+(SELECT count(*) FROM comments WHERE commentable_id = article.id AND commentable_type = "'.$type.'")+(SELECT count(*) FROM article_favourites WHERE article_id = article.id)) as totalCount'), 

Aber ich bin auf der Suche nach einer besseren Lösung

+2

IMHO überdenken Sie dies, fügen Sie sie nur in PHP. In MySQL müssten Sie die Unterabfragen wiederholen und sie als vierten Ausdruck in Ihrer Abfrage hinzufügen. – Shadow

+0

Ich muss 50000 Zeilen mit dem Gesamtergebniswert sortieren .. wie wäre es damit? –

+0

Dann möchten Sie vielleicht fließend verwenden. –

Antwort

0

Betrachtet man Ihre Kommentare über 50.000 Zeilen. Ich denke, das Beste, was man hier beachten sollte, sind Indizes. Solange commentable_id, rateable_id und article_id indiziert sind (vorausgesetzt natürlich articles.id ist ein Primärschlüssel), sollten Sie relativ schnell eine Abfrage erhalten.

In Bezug auf die Vereinfachung wird ein am besten lesbarer Code (der ebenfalls langsamer sein wird) sein, Beziehungen oder Joins in Verbindung mit fließenden zu verwenden, um die Anzahl zu finden. das heißt so etwas wie

$articles->comments()->count() 

Darüber hinaus, wenn Sie mit großen Daten zu tun hat, die Millionen von Zeilen wachsen kann, und Sie müssen eine Funktion wie das Sortieren durchzuführen, dann sind Sie mit einer Übersichtstabelle viel besser. Oder Sie fügen die Felder wie commentCount, avgRating und favoriteCount hinzu. Der Aufwand, diese Aggregate auszuführen und sie zu verwenden, um Ihre Daten ständig zu sortieren, wäre einfach zu viel.

+0

Ja, articles.id ist ein Primärschlüssel. –

+0

Ich bin kein Experte für erweiterte Abfragen. Kannst du mehr erklären .. wie wäre die fließende Abfrage? –