Abfrage gesucht
Nobbi
- datenbank
Hi,
ich habe eine Tabelle, in der ich Spieler pro Spiel eintrage. Es gibt Spieltage, deren Datum ich aber nicht kenne.
Also gibt es eine Tabelle 'Spieltage', in der das Datum (dd.mm.jjjj) festgehalten ist (leider ist das kein mysql-Spaltentyp, sondern ein varchar-Typ) und jeder Spieler, der an diesem Spieltag da war ist in einer Zeile eingetragen.
Name|Datum|Spiele-ID
Jens|25.07.2010|5
Pete|25.07.2010|5
Jens|06.08.2010|5
Pete|06.08.2010|5
Hein|06.08.2010|5
Susi|06.08.2010|5
Ich möchte nun für Spiele-ID 5 eine Liste der Teilnehmenden Spieler ausgeben, die beim letzten stattgefundenen Termin anwesend waren. Das Datum kenne ich aber nicht, sonst wärs ja einfach.
Ich bin auch nicht sicher, ob man nach varchar-typ-spalten gruppieren kann.
Könnt Ihr mir mal den entscheidenden Tip zu miener Frage geben?
VG, Nobbi
Ich habe was vergessen: Es ist eine mysql5-Datenbank.
Hello,
Ich möchte nun für Spiele-ID 5 eine Liste der Teilnehmenden Spieler ausgeben, die beim letzten stattgefundenen Termin anwesend waren. Das Datum kenne ich aber nicht, sonst wärs ja einfach.
gut, also finden wir doch erstmal die ID vom letzten Spieltag raus. Hmh, da fängt das Problem an, dein Varchar-Datentyp ist denkbar ungünstig. Wäre es eine Datumsspalte, wäre die einfach Anfrage:
SELECT DISTINCT ID FROM tab WHERE datum = (SELECT MAX(datum) FROM tab)
Nunja, du kannst versuchen dein Datum in ein Datum zu konvertieren:
SELECT DISTINCT ID FROM tab WHERE datum = (SELECT MAX((DATE(datum)) FROM tab)
obs klappt hängt vom genauen Inhalt ab.
Mit der genauen Information kann es jetzt dann losgehen, wir fragen die Spieler ab, die an einem der gefundenen Spiele teilgenommen haben:
SELECT name
FROM tab t1
WHERE id = (SELECT DISTINCT ID FROM tab WHERE datum = (SELECT MAX((DATE(datum)) FROM tab))
Ganz grundsätzlich ist da ne Menge Optimierungspotenzial - zum einen die Sache mit dem Varchar, zum zweiten macht es wahrscheinlich wenig Sinn das Datum UND die Spiele-ID redundant zu führen - überlege dir, ob nicht folgendes eine sinnvollere Struktur ist:
Tabelle spiele: Datum|Spiele-ID
Tabelle teilnahme: Spiele-ID|Name
Ich bin auch nicht sicher, ob man nach varchar-typ-spalten gruppieren kann.
kann man, aber das hilft dir wie weiter?
MfG
Rouven
Hi Rouven,
Hmh, da fängt das Problem an, dein Varchar-Datentyp ist denkbar ungünstig.
Davon habe ich einige :-(
Daher hier mal die Nachfrage: Kann ich den Spaltentyp einfach ändern oder verliere ich dadurch Daten oder kann das zu sonstigen Problemen führen? Wie gesagt, mysql 5.x.x
Was Deinen weiteren Optimierungsvorschlag angeht, die lasse ich mir zum nächsten großen Update durch den Kopf gehen. Jetzt auf die Schnelle geht das nicht, weil ich nebenher auch noch arbeiten muss :-)
Gruß, Nobbi
Hi,
Daher hier mal die Nachfrage: Kann ich den Spaltentyp einfach ändern oder verliere ich dadurch Daten oder kann das zu sonstigen Problemen führen?
Wenn du den Datentyp per ALTER TABLE änderst, muss das Format der Daten zum neuen Typ „passen“, bzw. sich sinnvoll in diesen umwandeln lassen.
dd.mm.jjjj eignet sich dazu aber nicht.
Dann gehst du besser so vor, dass du eine neue Spalte mit neuem Datentyp anlegst, und dann per Update die Daten aus der alten in die neue Spalte überträgst, wobei du sie so formatierst, dass sie zum neuen Spaltentyp passen.
Wenn du das gemacht und die Werte überprüft hast, dann kannst du anschließend die alte Spalte entfernen.
MfG ChrisB
Moin!
Mal was für die Zukunft:
Dein Problem wäre keines, wenn dein Datum ordentlich formatiert wäre. Solltest Du aus verschiedenen Gründen mal ein Datum als String speichern (bei Datei oder Verzeichnisnamen z.B.) dann YYYYMMDD. Trennzeichen sind wurscht. 20100728 oder auch 2010-07-28 lässt sich auch als String super sortieren und verarbeiten. Dann wäre statt eines MAX ein ORDER BY eine schnelle Lösung für dein Problem gewesen.
Ich muß auch oft mit Datenbanken arbeiten in denen Datumsfelder als String formatiert sind. Zum Glück stehen die Daten in der Quelle die zum Füllen der Tabellen benutzt werden im Format YYMMDD. Damit ist das Arbeiten halbwegs erträglich und ich versuche nicht nachträglich den Typen, der DB und Programm geschrieben hat, zu finden und zu erwürgen.