MySQL Abfrage: Komplexere Durschnittberechnung

CoRe

Mitglied
Hi all!

Also folgende Ausgangsdaten:
Ich habe eine Tabelle mit u.a. folgenden Daten:

id_user, id_eigenschaft

D.h. das könnte dann ungefähr so aussehen

id_user | id_eigenschaft
--------------------------------------
1 | 5
--------------------------------------
2 | 6
--------------------------------------
5 | 9
--------------------------------------
2 | 10
--------------------------------------
1 | 10

Ich möchte jetzt den Durchschnitt aus der Anzahl der Eigenschaften (id_eigenschaften) jedes Users (id_user) bilden.

D.h. ich müsste erstmal die Anzahl der Eigenschaften zu jeden User berechnen und dann aus allen "Anzahlen" den Durchschnitt bilden.

Aber ich möchte das ganze rein in der SQL Abfrage machen und ohne einer for-schleife in PHP.
Also dass ich eben als Ergebnis den Durchschnitts-Wert rausbekomme.

Kann mir da jemand helfen?

BIIG THX schon mal im vorraus!
 
Die Lösung findest Du bei den "Gruppenfunktionen":

GROUP BY (Aggregate) Functions

If you use a group function in a statement containing no GROUP BY clause, it is equivalent to grouping on all rows.

AVG(expr)
Returns the average value of expr.

mysql> SELECT id_user, AVG(id_eigenschaft)
-> FROM mytable
-> GROUP BY id_eigenschaft;
 
einfacher durchschnitt pro user:
select avg(id_eigenschaft), id_user from tableX order by id_user desc

den durchschnitt aus allen eigenschaften:
select avg(id_eigenschaft) from tableX
 
Hmm... also die GROUP BY Funktionen waren mir zwar noch nie so klar.
Aber dann habe ich ja immernoch nicht das Ergebnis inzusammenhang mit den Usern?
Ich möchte ja nicht den Durchschnitt der Werte die in der Tabelle stehen, sondern, den Durchschnitt der Anzahl bestimmter Einträge in der Tabelle in Zusammenhang mit den Usern.

Ich habe zwar inzwischen ein Lösung, aber die ist nicht so programmiert wie ich das ursprünglich wollte...

Naja sie sieht auf jedenfall so aus (vereinfacht):

PHP:
SELECT (COUNT(eigenschaften.id_eigenschaften) / COUNT(DISTINCT eigenschaften.id_user)) AS avgEigenschaften
		 FROM pr_tb_user_eigenschaften as eigenschaften

Obiges ist eigentlich nur ein Codeauszug bzw. hab für den Post hier die Abfrage auf das wesentliche reduziert.

Aber was ich immernoch nicht hinbekommen habe, ist wenn ich solche Abfragen mache, wenn ich dann Daten aus zwei Tabellen auslese.
Dann kommen da seltsam hohe Ergebnisse raus - das liegt dann bestimmt daran, wie man die GROUP Funktion einsetzt.
Aber wie ist die zu verwenden? Und was tut Sie eigentlich
 
Zuletzt bearbeitet:
Ich würde ehere darauf tippen, dass du die Tabellen nicht richtig in Beziehung setzt und so die Ergebnisse vervielfachst.
 
Hmm... und das heißt?

Also WHERE kommt da ja gar net vor, da ich ja aus allem jeweils nur so COUNT und AVG Sache auslese...
 
Sorry,

da gibt es einen tippfehler in meinem Beispiel:

mysql> SELECT id_user, AVG(id_eigenschaft)
-> FROM mytable
-> GROUP BY id_user;

Die Gruppe muss nach User gebildet werden, AVG() liefert den Mittelwert für jeden User zurück.
 
Ahso?!
Heißt das also, dass wenn ich den GROUP BY Befehl verwende, es bedeutet, dass ich er alle Ergebnisse/Handlungen immer jeweils in Abhängigkeit des Angegebenen Werts/Spalte angiebt?

Hab ich das soweit richtig verstanden?
 
Ja, so sieht es aus. Die Gruppenfunktionen wie min, max, avg usw. werden vom RDBMS aus den Gruppen gebildet die du in group by () stehen hast, und die aber auch im select-Teil vorkommen müssen.
Wenn Du die Werte z.B. für User, Jahr und Monat haben möchtest:

select user_id, jahr, monat, min(xxx), max(xxx), avg(xxx)
from yyy where .....
group by( user_id, jahr, monat )

Das ganze geht natürlich auch über mehrere Tabellen.
 

Neue Beiträge

Zurück