2017-11-14 4 views
0

Ich bin mir nicht ganz sicher, wie ich diesen Beitrag überhaupt nennen soll, weil ich nicht genau weiß, wie ich ihn stellen soll.Alles aus Tabelle 1 mit durchschnittlichen AND distinct Werten aus Tabelle 2 und Tabelle 3 auswählen

Ich habe drei Tabellen. Ein mit den Nutzern, einem mit Lebensmitteln und einem mit der Benutzer Bewertung der Lebensmittel, wie solche (vereinfachtes Beispiel):

Foods 
id name type 
--------------------- 
1 Apple fruit 
2 Banana fruit 
3 Steak meat 

Users 
id username 
----------------- 
1 Mark 
2 Harrison 
3 Carrie 

Scores (fid = food id, uid = user id) 
fid uid score 
--------------------- 
1 1 3 
1 2 5 
2 1 2 
3 2 3 
Jetzt

, habe ich diese Abfrage, die perfekt funktioniert:

SELECT fn.name as Food, ROUND(AVG(s.score),1) AS AvgScore FROM Foods fn LEFT JOIN Scores s ON fn.id = s.fid GROUP BY fn.id ORDER BY fn.name ASC 

Wie Sie können sagen, es listet alle Namen von Lebensmitteln einschließlich einer durchschnittlichen von allen Nutzern Bewertungen des Essens.

Ich möchte auch die einzigartige Benutzer eigene Punktzahl hinzufügen. (Angenommen, wenn Mark angemeldet ist, seine uid in einer Sitzungsvariablen gesetzt ist oder was auch immer)

ich die folgende Ausgabe benötigen, wenn Sie als Mark angemeldet:

Food AvgScore Your Score 
Apple 4   3 

ich mehrere Versuche gemacht haben um das zu erreichen, aber ich kann keine Lösung finden. Ich habe gelernt, dass wenn Sie eine Frage haben, ist es sehr wahrscheinlich, dass jemand anderes es vor Ihnen gefragt hat, aber ich weiß nicht genau, wie ich die Frage formulieren soll, damit ich keine Antworten beim Googlen bekomme. Ein Zeiger in die richtige Richtung würde sehr geschätzt werden.

Antwort

0

Sie mit case versuchen:

SELECT fn.name as Food, 
     ROUND(AVG(s.score),1) AS AvgScore, 
     sum(case s.uid = $uid when s.score else 0 end) as YourScore 
FROM Foods fn 
LEFT JOIN Scores s ON fn.id = s.fid 
GROUP BY fn.id 
ORDER BY fn.name ASC 

$uid ist vom Kurs abgekommen variabel.

+0

Ich habe Ihre Lösung kopiert, wie sie ist, und es gab mir einen SQL-Syntaxfehler, aber ich akzeptiere Ihre Antwort als eine Lösung, weil es genau das getan hat, was ich gefragt habe - ein Zeiger in die richtige Richtung. Ich hatte die "Fall" -Anweisung nie zuvor gesehen, und nach ein paar Versuchen habe ich es so funktionieren lassen, wie ich es wollte. Vielen, vielen Dank! :) Habe ich es aus: 'Summe (Fall s.uid = $ uid wenn s.score sonst 0 Ende) als YourScore' zu: ' Summe (Fall, wenn s.uid = 2 dann s .Score sonst 0 Ende) als YourScore' –

+0

Willkommen. :) Wahrscheinlich hast du den Fehler gegeben weil '$ uid' die Variable ist. –

+0

Nein, ich habe nur vergessen, es zu ändern, als ich den Kommentar gepostet habe. Und jetzt kann ich den Kommentar nicht mehr bearbeiten, weil er zu alt ist. –

Verwandte Themen