2017-12-21 3 views
0

ich einen Artikel Tabelle mit einer Beziehung mit 5-Sterne-Rating Bewertungen Tabelle one-to-many in meinem db haben zusammen wie folgt:Wählen Sie Produkte mit Bestnoten in SQL/eloquent ORM

# reviews 
- id 
- product_id 
- body 
- rating // possible values are 1 to 5 
- created_at 
- updated_at 

Ich habe ein Abschnitt auf der Homepage der Website für Top-Produkte, die ich hoch bewertete Produkte anzeigen möchte. Also das Problem ist, dass ich eine Abfrage mit Eloquent ORM schreiben muss, um die Top 5 hoch bewerteten Produkte zu holen?

BTW, bitte fühlen Sie sich frei, einfache SQL-Abfragen vorschlagen, und ich sehe, ob ich in der Lage bin, sie zu beredten Methoden zu konvertieren.

Vielen Dank im Voraus.

Antwort

0
SELECT p.*, AVG(r.rating) as average_rating 
FROM products as p 
INNER JOIN reviews as r ON r.product_id = p.id 
GROUP BY p.id 
ORDER BY average_rating DESC 
LIMIT 5 

PS: Wenn Sie von der Summe bestellen möchten, verwenden Sie einfach SUM() anstelle von durchschnittlich

ich denke, das den Trick tun sollte, wird dies alle Ihre Produkte auswählen (dies ist das Endergebnis, das Sie sehen möchten), verbinden Sie sie innerlich mit Bewertungen durch product_id. Da Sie nun Mitglied sind, müssen Sie eine Gruppe nach einer bestimmten Tabelle hinzufügen, ansonsten haben Sie mehrere Einträge für dasselbe Produkt. Bestellen Sie die Produkte mit der Bewertung DESC, was bedeutet, dass die höchsten Punktzahlen oben stehen. Wählen Sie die letzten 5, indem Sie Ihre Abfrage einschränken.

Ich bin nicht mit ORM für Laravel bekannt, ich kenne Lehre nur als ORM.

+0

danke für deine antwort. aber es funktioniert nicht Ich bekam ORDER BY-Klausel ist nicht in der GROUP BY-Klausel und enthält nichtaggregierte Spaltenfehler. – Sina

+0

Ich habe meinen Post bearbeitet, ich habe meinen Code in HeidiSQL ausgeführt und es hat perfekt funktioniert. –

+0

Ich habe eine ", reviews.id" zur Gruppierung nach Klausel hinzugefügt und den Fehler beseitigt, aber die Abfrage ist immer noch falsch, weil sie die Produkte mit der Ziffer 5 in ihren Bewertungen abruft. In der Zwischenzeit, was es tun sollte, ist die Summe aller Bewertungen für jedes Produkt zu berechnen (1 + 5 + 2 + 4 + 3) und dann sehen, welche Summe größer als die anderen ist und die Top 5 in der Reihenfolge zurückgegeben. – Sina

Verwandte Themen