Hallo Communitiy,
in letzter Zeit befasse ich mich intensiver mit OO, und habe schon den einen oder anderen Tipp hier entnehmen können. Danke erstmal soweit.
Nun stehe ich vor einen SQL-Problem, das mir keine Ruhe lässt. Für die Verwaltung meines Skat-Clubs habe ich zwei Tabellen in einer DB angelegt:
Tabelle "Mitglieder":
"ID" (Primary Key)
"Name"
...
Tabelle "Spiele":
"ID" (Primary Key)
"Spieler-ID"
"Datum"
"Punkte"
...
Die Felder "Mitglieder"."ID" und "Spiele"."Spieler-ID" stehen in einer 1:n-Relation.
Nun habe ich vor, von jedem Spieler die Punkte seines letzten Spieltages und in einer SQL-Abfrage auszuwerten, der mit der höchsten Punktzahl zuerst.
Beispiel:
Mitglieder
ID / Name
1 / Otto
2 / Hugo
3 / Karl
4 / Hanno
Spiele
ID / Spieler-ID / Datum / Punkte
0 / 3 / 20.05.12 / 1300
1 / 1 / 20.05.12 / 1000
2 / 2 / 20.05.12 / 1200
3 / 3 / 27.05.12 / 800
4 / 4 / 16.05.12 / 1100
5 / 4 / 20.05.12 / 750
6 / 1 / 22.05.12 / 950
7 / 2 / 22.05.12 / 1150
Die SQL-Abfrage soll nun folgendes Ergebnis liefern:
Name / Datum / Punkte
Hugo 22.05.12 1150
Otto 22.05.12 950
Karl 27.05.12 800
Hanno 20.05.12 750
Wer kann mir weiterhelfen? Danke im Voraus!
Viele Grüße
Martin...
SQL-Abfrage Punktestand
Moderator: Moderatoren
Re: SQL-Abfrage Punktestand
Hallo, das geht mit einer Unterabfrage. Erstelle zuerst einen SELECT, mit dem der letzte Spieltag und das jeweilige Maximum bestimmt werden:
Diese Hilfstabelle wird mit der Spieler-Tabelle verknüpft:
(nicht getestet, deshalb ohne Gewähr) Gruß Jürgen
PS. Wenn nur Standardzeichen A...Z_0...9 verwendet werden, kann auf die Gänsefüßchen werden. Dann ist der Code leichter zu lesen.
Code: Alles auswählen
SELECT s."Spieler-ID" as SID, MAX(s.Datum) as LetzterSpieltag, MAX(s.Punkte) as Punkte
FROM Spiele s
GROUP BY s."Spieler-ID"
Code: Alles auswählen
SELECT m.Name, h.LetzterSpieltag, h.Punkte
FROM ( hierher der obige SELECT vollständig ) AS Hilfstabelle h
JOIN Mitglieder m ON m.ID = h.SID
PS. Wenn nur Standardzeichen A...Z_0...9 verwendet werden, kann auf die Gänsefüßchen werden. Dann ist der Code leichter zu lesen.
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
Re: SQL-Abfrage Punktestand
Servus
juethos Ansatz mit Unterabfrage ist prinzipiell korrekt. Die Abfrage muss jedoch anders aussehen:
juethos Ansatz mit Unterabfrage ist prinzipiell korrekt. Die Abfrage muss jedoch anders aussehen:
Code: Alles auswählen
SELECT
"m"."Name", "s"."Datum", "s"."Punkte"
FROM
"Spiele" AS "s", "Mitglieder" AS "m"
WHERE
"s"."Spieler-ID" = "m"."ID"
AND "s"."Datum" = (SELECT MAX("Datum") FROM "Spiele" WHERE "Spieler-ID" = "s"."Spieler-ID")
Re: SQL-Abfrage Punktestand
Autsch.
Stimmt, ich habe nicht genau genug gedacht. Bei meiner Lösung werden für jeden Spieler sein letzter Spieltag und sein persönliches Maximum zusammenzogen. Das entspricht nicht dem gewünschten Ziel.
DPunch's Lösung ist korrekt. Der wichtigste Gedanke ist, dass die Tabelle Spiele zweimal benutzt wird: zum einen für den letzten Spieltag, zum anderen für die Punkte an diesem Tag. Jürgen

DPunch's Lösung ist korrekt. Der wichtigste Gedanke ist, dass die Tabelle Spiele zweimal benutzt wird: zum einen für den letzten Spieltag, zum anderen für die Punkte an diesem Tag. Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC