2010-11-18 14 views
1

Ich versuche, ein Rating-System zu schaffen, in dem der Benutzer Bilder/Videos/Audio usw. Ich habe zwei Tabellen im MomentRückkehr durchschnittliche Bewertung aus einer Datenbank (SQL)

Table: products 
Cols: product_id[PK] | name | category | type | link 

Diese Rate ist die Produkttabelle und enthält Informationen über die Produkte. Wenn Sie von Produkten verwirrt sind, denken Sie an das "Produkt" als Bild/Video/Audio, ich habe es so genannt, weil ich es einfacher verstehen kann. Die zweite Tabelle ist die Bewertungen

Table: product_ratings 
Cols: rating_id[PK] | rating | product_id | timestamp 

Diese Tabelle speichert Informationen über die Bewertung, die der Benutzer gegeben hat.

Ich möchte eine Seite, wo es die höchste Bewertung (im Durchschnitt) für alle "Produkte" angezeigt wird. Bisher habe ich durch SA sah, fand er den Folge Stück Code:

SELECT 
p.product_id, p.name, 
AVG(pr.rating) AS rating_average 
FROM products p 
INNER JOIN product_ratings pr 
ON pr.product_id = p.product_id 
WHERE p.product_id = 1 

Das gibt nur die durchschnittliche Bewertung für einen bestimmten product_id, Wie würde ich mich über all die product_ids bekommen und ihre durchschnittliche Bewertung, und wie würde ich die höchste über PHP finden?

Ich habe versucht:

WHERE p.product_id < 1 AND p.product_id < 30 

Aber das gibt nur product_id von 2, mit seinem Namen und AVERAGE_RATING ist, was ich nicht verstehe.

Guidance/Links zu Material sind willkommen

+0

Warum geben Sie "where p.product_id = 1"? –

+0

Dies war nur um zu zeigen, dass die angegebene SQL gibt die durchschnittliche Bewertung für die angegebene Produkt ID – Daniel

Antwort

4
SELECT 
    p.product_id, 
    p.name, 
    AVG(pr.rating) AS rating_average 
FROM products p 
INNER JOIN product_ratings pr 
ON pr.product_id = p.product_id 
GROUP BY p.product_id 
ORDER BY rating_average DESC 
LIMIT 1 
+0

Ich bin einfach zu langsam beim Tippen lol Genau das habe ich mir gedacht. – Nasir

+0

Danke Mark, das scheint zu tun, was ich ursprünglich wollte. Wird sich jetzt umsehen, um zu sehen, wie das erste Element in der Liste ausgewählt wird (d. H. Das am höchsten bewertete Produkt). – Daniel

+0

Sie können Marks Abfrage auch als Subselect für eine 'from'-Klausel verwenden, so dass Sie eine' MAX (rating_aberage) 'über Ihre durchschnittlichen Bewertungsergebnisse erhalten. –

4

Versuche mal:

SELECT 
p.product_id, p.name, 
AVG(pr.rating) AS rating_average 
FROM products p 
INNER JOIN product_ratings pr 
ON pr.product_id = p.product_id 

auch dies ist bedeutungslos Ausdruck:

WHERE p.product_id < 1 AND p.product_id < 30 

, weil es zu

WHERE p.product_id < 1 
vollständig entspricht

und ich bezweifle, dass Sie IDs unter Null haben

+0

Ich meine mehr als 1 und weniger als 30, ich habe verwirrt Ich denke – Daniel

+0

welche Datenbank erfordert keine Gruppe von? –

+0

@Stephanie Seite mysql – Andrey

0

Ihre Anfrage ist in der Nähe. Entfernen Sie einfach die WHERE-Klausel, die alles filtert.

Dies gibt Ihnen die Durchschnittswerte für jedes Produkt, sortiert mit der höchsten durchschnittlichen Bewertung am Anfang der Ergebnismenge.

+0

Dies zeigt nur eine Zeile aus irgendeinem Grund an, siehe Mark Byers oben, er scheint alle Produkt-IDs aufzulisten, die zuvor bewertet wurden – Daniel

Verwandte Themen