Seite 1 von 1

SQL-Abfrage Punktestand

Verfasst: Mo, 05.11.2012 06:55
von MadEff
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...

Re: SQL-Abfrage Punktestand

Verfasst: Mo, 05.11.2012 10:27
von juetho
Hallo, das geht mit einer Unterabfrage. Erstelle zuerst einen SELECT, mit dem der letzte Spieltag und das jeweilige Maximum bestimmt werden:

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"
Diese Hilfstabelle wird mit der Spieler-Tabelle verknüpft:

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
(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.

Re: SQL-Abfrage Punktestand

Verfasst: Mo, 05.11.2012 13:07
von DPunch
Servus

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

Verfasst: Mo, 05.11.2012 13:41
von juetho
Autsch. :shock: 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