121 Aufrufe
Gefragt in Datenbanken von

Hallo zusammen!

Ich habe (vereinfacht dargestellt) folgende MySQL Tabelle (nennen wir sie "ergebnisse"):

id datum punkte
spieler1 2023-12-20 15
spieler3 2023-12-20 12
spieler2 2023-12-17 9
spieler3 2023-12-17 17
... ... ...

Ich möchte gerne den "Punkte-Trend" darstellen und dabei für jeden einzelnen Spieler folgendes berechnen: 1) Den Durchschnitt der vergangenen 5 Einträge. 2) Den Durchschnitt der vergangenen 10 Einträge. 3) Den Gesamtdurchschnitt.

Das Resultat sollte so aussehen:

id durchschnitt5 durchschnitt10 durchschnittGesamt
spieler1 17.5 16.3 12.5
spieler2 9.7 14.2 16.1
spieler3 19.7 15.6 16.7
... ... ... ...

Ist es möglich, dies mit einer einzigen MySQL Abfrage zu erreichen?

Ich muss vorneweg sagen, dass ich kein Datenbank-Experte bin. Ich habe mir jedoch mit Hilfe von Google folgende Abfrage zusammengestellt:

SELECT
    e.id,
    (SELECT AVG(letzte5.punkte) FROM (
        SELECT punkte FROM ergebnisse WHERE id = e.id ORDER BY datum DESC LIMIT 5) AS letzte5
    ) AS durchschnitt5,
    (SELECT AVG(letzte10.punkte) FROM (
        SELECT punkte FROM ergebnisse WHERE id = e.id ORDER BY datum DESC LIMIT 10) AS letzte10
    ) AS durchschnitt10,
    (SELECT AVG(alle.punkte) FROM (
        SELECT punkte FROM ergebnisse WHERE id = e.id) AS alle
    ) AS durchschnittGesamt
FROM ergebnisse e
GROUP BY e.id;

Die einzelnen Bestandteile der Abfrage funktionieren und ergeben Sinn für mich. Aber als Ganzes zusammengefügt, bekomme ich einen Fehler: "Unbekanntes Tabellenfeld 'e.id' in where clause". Weiteres Suchen scheint drauf hinzuweisen, dass es ein Problem mit dem Alias 'e.id' gibt und, dass dieser wohl nicht im WHERE-Teil genutzt werden kann. Ich weiß aber nicht, wie ich die Abfrage umschreiben muss bzw. ob mein Ansatz komplett daneben ist.

Würde mich über Tips, Hinweise, Untersütztung sehr freuen.

Vielen Dank im Voraus!

4 Antworten

0 Punkte
Beantwortet von computerschrat Profi (32.2k Punkte)
Hallo Onxy,

kannst du hier mal die Struktur deiner Tabelle Ergebnisse posten?

Gruß computerschrat
0 Punkte
Beantwortet von

Meinst du das hier?

Name Typ Kollation Null
id varchar(20) utf8mb4_general_ci Nein
datum varchar(10) utf8mb4_general_ci Nein
punkte smallint(2) - Nein

(Ich weiß, dass "datum" kein varchar sein sollte... Aber wie gesagt, ich bin kein Datenbank-Experte. Es war für mich persönlich hier am Einfachsten mit Strings zu arbeiten. Es geht "nur" um ein Hobby-Projekt.)

0 Punkte
Beantwortet von computerschrat Profi (32.2k Punkte)
Hallo Onyx,

könnte es sein, dass der Tabellenname e, auf den du mit e.id referenzierst innerhalb des Aufbaus der geschachtelten Select-Anweisungen nicht bekannt ist?

Gruß computerschrat
0 Punkte
Beantwortet von
Hallo computerschrat!

Ja, genau das ist das Problem. Wie ich oben geschrieben habe, ist `e.id` in meiner Abfrage unbekannt. Soweit ich es verstanden habe, darf man keine Aliase im WHERE-Teil einer Abfrage nutzen.

Meine Frage ist nun: Kann man diese Abfrage irgendwie umschreiben, um die gewünschte Ausgabe zu erzielen?
...