MYSQL: durchschnitt (AVG) beschränken
stefnet
- datenbank
0 Cheatah0 MySQL: Tabellen verknüpfen
Vinzenz Mai0 stefnet0 Vinzenz Mai0 stefnet0 Vinzenz Mai0 stefnet
0 Ilja
0 Ilja
Hallo,
ich habe eine etwas kompliziertere mysql-abfrage und komm jetzt einfach nicht weiter.
ich habe zwei tabellen (Namen, Werte), die ich in dem angehängten bild dargestellt hab.
es soll in der ausgabe die durchschnittsnote errechnet werden und zwar nur für den jeweiligen namen.
ich bin jetzt soweit gekommen, dass er eine durchschnittsnote errechnet, doch leider nur von allen namen.
wie beschränke ich die durchschnittsberechnung auf die jeweilige "namen_id"?
mein bisheriger code:
--------------------------------------------
SELECT
Namen.ID,
Namen.name,
AVG(Werte.note) AS 'durchs_note'
FROM
Namen,
Werte
GROUP
by Namen.ID
;
---------------------------------------------
hoffe ihr habt verstanden, worum es mir geht.
gruß
stefan
Hi,
wie beschränke ich die durchschnittsberechnung auf die jeweilige "namen_id"?
mittels der WHERE-Clause.
Cheatah
Hallo Stefan,
ich habe eine etwas kompliziertere mysql-abfrage und komm jetzt einfach nicht weiter.
Deine MySQL-Abfrage ist nicht kompliziert, sie ist leider syntaktisch falsch.
ich habe zwei tabellen (Namen, Werte), die ich in dem angehängten bild dargestellt hab.
Leider gibts die Bilder nicht mehr. Könntest Du die Spalten Deiner Tabellen einfach posten?
ich bin jetzt soweit gekommen, dass er eine durchschnittsnote errechnet, doch leider nur von allen namen.
wie beschränke ich die durchschnittsberechnung auf die jeweilige "namen_id"?
> SELECT
> Namen.ID, -- danach ist gruppiert, gut
> Namen.name, -- nach dieser Spalte musst Du auch gruppieren
> AVG(Werte.note) AS 'durchs_note'
> FROM
> Namen, -- hier erstellst Du ein wunderbares kartesisches
> Werte -- Produkt beider Tabellen.
-- Verknüpfe die beiden Tabellen mit einem Join
> GROUP BY
> Namen.ID,
Namen.name -- fehlt :-)
Ich vermute Du suchst den (INNER) JOIN Deiner beiden Tabellen. Dazu empfehle ich Dir:
Einführung Joins
Fortgeschrittene Joins
Bitte gib Deine MySQL-Version an. Was MySQL kann und was nicht, das ist in hohem Grad von der Versionsnummer abhängig.
Freundliche Grüße
Vinzenz
Hallo Stefan,
[...]
Leider gibts die Bilder nicht mehr. Könntest Du die Spalten Deiner Tabellen einfach posten?
Namen
ID (unique), name, ...
Werte
ID (unique), namen_id, note
ich bin jetzt soweit gekommen, dass er eine durchschnittsnote errechnet, doch leider nur von allen namen.
wie beschränke ich die durchschnittsberechnung auf die jeweilige "namen_id"?
SELECT
Namen.ID, -- danach ist gruppiert, gut
Namen.name, -- nach dieser Spalte musst Du auch gruppieren
AVG(Werte.note) AS 'durchs_note'
FROM
Namen, -- hier erstellst Du ein wunderbares kartesisches
Werte -- Produkt beider Tabellen.-- Verknüpfe die beiden Tabellen mit einem Join
GROUP BY
Namen.ID,
Namen.name -- fehlt :-)
>
> Ich vermute Du suchst den (INNER) JOIN Deiner beiden Tabellen. Dazu empfehle ich Dir:
>
> [Einführung Joins](http://aktuell.de.selfhtml.org/artikel/review/datenbanken/joins/)
> [Fortgeschrittene Joins](http://aktuell.de.selfhtml.org/artikel/review/datenbanken/fortgeschrittene-joins/)
werd ich mir mal durchlesen.
>
> Bitte gib Deine MySQL-Version an. Was MySQL kann und was nicht, das ist in hohem Grad von der Versionsnummer abhängig.
Version 4.1
>
>
> Freundliche Grüße
>
> Vinzenz
Hallo Stefan,
Leider gibts die Bilder nicht mehr. Könntest Du die Spalten Deiner Tabellen einfach posten?
Namen
ID (unique), name, ...Werte
ID (unique), namen_id, note
SELECT
Namen.ID, -- danach ist gruppiert, gut
Namen.name, -- nach dieser Spalte musst Du auch gruppieren
AVG(Werte.note) AS 'durchs_note'
FROM
Namen -- beachte: Komma entfernt
INNER JOIN -- ich gehe davon aus, dass die Spalte
-- namen_id in Tabelle "Werte" mit der
-- Spalte ID der Tabelle "Namen" verknüpft sind
Werte
ON Namen.ID = Wert.namen_id
GROUP BY
Namen.ID,
Namen.name -- fehlt :-)
-- Wie Ilja sagte, kannst Du dies in MySQL weglassen,
-- aber gewöhne Dir solche Schlampigkeit gar nicht
-- erst an.
sollte liefern, was Du suchst und in
> [Einführung Joins](http://aktuell.de.selfhtml.org/artikel/review/datenbanken/joins/)
steht die weitere Erläuterung.
> [Fortgeschrittene Joins](http://aktuell.de.selfhtml.org/artikel/review/datenbanken/fortgeschrittene-joins/)
> werd ich mir mal durchlesen.
Das ist eine gute Idee.
> Version 4.1
Das hier kann sogar die 3.23.x :-)
Freundliche Grüße
Vinzenz
Leider gibts die Bilder nicht mehr. Könntest Du die Spalten Deiner Tabellen einfach posten?
Namen
ID (unique), name, ...Werte
ID (unique), namen_id, note
Also ich hab jetzt diesen Code:
SELECT
Namen.ID,
Namen.name,
AVG(Werte.note) AS 'durchs_note'
FROM
Namen
INNER JOIN
Werte
ON
Namen.ID = Wert.namen_id
GROUP BY
Namen.ID,
Namen.name
;
Soweit so gut, die Durchschnittswerte werden richtig ausgegeben.
doch fehlen jetzt die "namen", zu denen keine "note" exitstiert. Das sollte nicht so sein. :-|
sollte liefern, was Du suchst und in
steht die weitere Erläuterung.
Fortgeschrittene Joins
werd ich mir mal durchlesen.Das ist eine gute Idee.
Version 4.1
Das hier kann sogar die 3.23.x :-)
Gruß
Stefan
Hallo Stefan,
Soweit so gut, die Durchschnittswerte werden richtig ausgegeben.
doch fehlen jetzt die "namen", zu denen keine "note" exitstiert. Das sollte nicht so sein. :-|
Ersetze den INNER JOIN durch einen LEFT JOIN, siehe Einführung Joins.
Freundliche Grüße
Vinzenz
Hallo Stefan,
Soweit so gut, die Durchschnittswerte werden richtig ausgegeben.
doch fehlen jetzt die "namen", zu denen keine "note" exitstiert. Das sollte nicht so sein. :-|Ersetze den INNER JOIN durch einen LEFT JOIN, siehe Einführung Joins.
dank an alle die mir geholfen haben, hat geklappt.
yo,
Deine MySQL-Abfrage ist nicht kompliziert, sie ist leider syntaktisch falsch.
nein, er benutzt mysql und dort ist diese abfrage syntaktisch richtig, da die gleiche ID nicht noch unterschiedliche namen haben wird. bei allen anderen dbms wäre dies ein fehler, nicht aber bei mysql...
Ilja
yo,
ich bin jetzt soweit gekommen, dass er eine durchschnittsnote errechnet, doch leider nur von allen namen.
wie beschränke ich die durchschnittsberechnung auf die jeweilige "namen_id"?
dein ansatz mit group by ist vollkommen richtig und bei mysql musst du auch nicht zusätzlich nach dem namen gruppieren. was aber fehlt ist die JOIN bedingung. deswegen wird das karthesische produkt beider tabelle gebildet. nimm die join bedingung in die WHERE klausel mit rein und dann stimmt die abfrage.
Ilja