TwoBe Geschrieben 21. Juni 2009 Teilen Geschrieben 21. Juni 2009 Ich hab eine Datenbank mit den spalten userid, timestamp, punkte und in diese Datenbank wird jetzt in unregelmässigen Abständen ein neue Zeile mit Informationen über den Punktestand eines jeweiligen users, identifiziert anhand seiner id zum aktuellen zeitpunkt eingetragen. Jetzt will ich quasi eine Art Highscore ausgeben und hab keine Ahnung wie ich da ansetzen soll... Ich hoffe ich finde hier Hilfe Danke... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 22. Juni 2009 Teilen Geschrieben 22. Juni 2009 Ein Highscore über alle Datensätze oder soll nur der maximale wert eines Users verwendet werden? Soll der Highscore alle user beinhalten oder z.B. nur die 10 besten? Welche DB (Hersteller) verwendest Du? Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TwoBe Geschrieben 22. Juni 2009 Autor Teilen Geschrieben 22. Juni 2009 Ich verwende eine MySQL Datenbank wo ich mit PHP drauf zugreife... Ich brauche im Prinzip eine Tabelle als Ausgabe die in der einen Spalte die Userid und in der anderen Spalte die Punkte stehen, allerdings sortiert nach Punkte absteigend... Die Punkte zur jeweiligen Userid sind immer die des letzten Timestamps! Ums mal "einfacher" auszudrücken: Gib mir alle userids und punkte, sortiert nach timestamp bzw. Punkte, allerdings keine userid doppelt... Is irgendwie schwierig zu erklären, aber hoffe das is verständlich Nur die ersten 10 könnte ich ja dann über ein Limit lösen... Danke schonmal für Antworten Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
T3D Geschrieben 22. Juni 2009 Teilen Geschrieben 22. Juni 2009 das sollte es sein: SELECT t1.* FROM punktetabelle as t1 WHERE t1.timestamp = ( SELECT MAX(timestamp) FROM punktetabelle as tsub WHERE tsub.userid = t1.userid GROUP BY tsub.userid ) ORDER BY t1.timestamp LIMIT 10[/PHP] Ted Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TwoBe Geschrieben 22. Juni 2009 Autor Teilen Geschrieben 22. Juni 2009 Danke für deine Mühe, aber leider bringt das irgendwie nicht das richtige ergebniss... Ich geb mal ein Beispiel an: tabelle usperpoints mit columns userid, timestamp, punkte zeile 1: 1234, 1.1.09, 100 zeile 2: 4321, 2.1.09, 120 zeile 3: 3214, 3.1.09, 150 zeile 4: 1234, 4.1.09, 180 zeile 5: 4321, 3.1.09, 80 sollte als ausgabe folgendes haben: zeile 4 zeile 3 zeile 5 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
T3D Geschrieben 23. Juni 2009 Teilen Geschrieben 23. Juni 2009 Danke für deine Mühe, aber leider bringt das irgendwie nicht das richtige ergebniss... Ich geb mal ein Beispiel an: tabelle usperpoints mit columns userid, timestamp, punkte zeile 1: 1234, 1.1.09, 100 zeile 2: 4321, 2.1.09, 120 zeile 3: 3214, 3.1.09, 150 zeile 4: 1234, 4.1.09, 180 zeile 5: 4321, 3.1.09, 80 sollte als ausgabe folgendes haben: zeile 4 zeile 3 zeile 5 achja aender ma ORDER BY t1.timestamp in ORDER BY t1.punkte um edith: evtl musst du noch die richtung mit angeben, aber ich verwechsel immer ASC und DESC von daher hab ichs einfach weggelassen :> Ted Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dimikar Geschrieben 23. Juni 2009 Teilen Geschrieben 23. Juni 2009 (bearbeitet) Die Frage ist nun, kann es an einem Tag mehrere Sätze eines Spielers geben? Wenn ja, dann wäre die Anforderung, dass keine doppelte Spielersätze ausgegeben werden sollen, mit Teds Statement nicht erfüllt. Und das weil der Timestamp ohne Uhrzeit gespeichert wird. In dem Fall müsste man noch zusätzlich nach der höchsten Tagespunktzahl suchen und zwar gruppiert nach Spieler Id und Datum. Im Subselect muss in dem fall eigentlich keine group by Klausel sein. Hier mal mein Vorschlag (da kein mysql zur Verfügung ungetestet) SELECT ups.userid ,ups.TIMESTAMP ,MAX(ups.punkte) FROM userpoints ups WHERE ups.TIMESTAMP = (SELECT MAX(ups2.TIMESTAMP) FROM userpoints ups2 WHERE ups.userid = ups2.userid) GROUP BY ups.userid ,ups.TIMESTAMP ORDER BY MAX(ups.punkte) desc Edit: Das ist aber keine wirkliche Highscoretabelle sondern eine "Lastscore"-Tabelle. ;-) Bearbeitet 23. Juni 2009 von dimikar Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
T3D Geschrieben 23. Juni 2009 Teilen Geschrieben 23. Juni 2009 Wenn ja, dann wäre die Anforderung, dass keine doppelte Spielersätze ausgegeben werden sollen, mit Teds Statement nicht erfüllt. Und das weil der Timestamp ohne Uhrzeit gespeichert wird. Oha gar nich drauf geachtet... denn er hat geschrieben "timestamp" und timestamp = sekunden seit 1.1.1970 Zeitstempel ? Wikipedia aber gut das es noch leute gibt die aufpassen Ted Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dimikar Geschrieben 23. Juni 2009 Teilen Geschrieben 23. Juni 2009 Hehe ja das mit dem Timestamp hatte ich auch am Anfang gedacht aber dann wurden die Satzbeispiele gepostet. Du kannst nichts dafür Ted. Wobei wir es immer noch nicht wissen ob es mehrere Sätze pro Spieler und pro Datum geben kann. Wenn nicht dann tut es deine Abfrage auch. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.