Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Bestes Resultat unter Berücksichtigung von mehr als einem Argument

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Bestes Resultat unter Berücksichtigung von mehr als einem Argument

    Hallo zusammen

    Ich hab eine Rangliste mit folgendem unten stehendem Aufbau. Nun möchte ich nur das Beste Resultat eines Benutzers in der Rangliste anzeigen und zwar so, dass nebst der max. erreichten Punktzahl auch noch die gemessene Zeit berücksichtigt wird. Das heisst bei gleicher Punktzahl eines Benutzers soll die schnellere Zeit über den nächst höheren Rang entscheiden.

    Unter Berücksichtigung von nur einem Argument ist dies mit dem GROUP Statement auf den Benutzernamen und dem Anwenden der max()-funktion auf die Punktzahl kein Problen.
    Das Problem liegt aber daran, dass die zugehörige Zeit in der Rangierung auch noch berücksichtigt werden soll. Das heisst, in der Ausgabe wird der erste gespeicherte Datensatz genommen und und die max Punktzahl des Benutzers angezeigt, jedoch die falsche Zeit ( und Datum).

    Beispiel der Ausgangslage (Select ergibt unten stehende Liste, soweit Okay):

    SELECT benutzernamen, datum, punkte, zeit FROM user_quiz
    ORDER BY benutzernamen DESC, punkte DESC, zeit ASC;


    Rang BENUTZERNAMEN Datum Punkte Zeit
    1 fluryk 2011-11-13 21:21:41 6 00:22
    2 admin1 2011-11-13 21:28:45 5 00:19
    3 admin2 2011-11-01 12:06:40 5 00:33
    4 fluku 2011-11-13 20:42:37 5 00:35
    5 admin2 2011-11-13 21:19:22 5 00:46
    6 admin1 2011-11-01 22:27:30 4 00:30
    7 admin1 2011-11-01 16:16:25 4 00:34
    8 admin1 2011-11-01 22:32:24 2 00:32
    9 fluku 2011-11-05 18:51:39 0 00:00
    10 admin1 2011-11-04 01:05:01 0 00:00
    11 admin1 2011-11-01 22:53:15 0 00:00


    Ziel (bestes Resultat unter Berücksichtigung der Punktzahl und Zeit).
    Grundsätzlich Okay aber, ich erhalte aber ich erhalte zur max. Punktzahl die falsche Zeit und das Datum, wo der Benutzer erreicht hat.

    SELECT benzuternamen, datum, punkte, zeit FROM user_quiz
    GROUP BY benutzernamen
    ORDER BY benutzernamen DESC, punkte DESC, zeit ASC;


    Rang BENUTZERNAMEN Datum Punkte Zeit
    1 fluryk 2011-11-13 21:21:41 6 00:22
    2 admin2 2011-11-01 12:06:40 5 00:33
    3 admin1 2011-11-04 01:05:01 5 00:00
    4 fluku 2011-11-05 18:50:51 5 00:19


    Wie komme ich zum richtigen Ergebnis?
    Für eine Hilfe wäre ich echt dankbar.

  • #2
    Zitat von Fluku Beitrag anzeigen
    ich erhalte aber ich erhalte zur max. Punktzahl die falsche Zeit und das Datum, wo der Benutzer erreicht hat.
    Ja, verständlich – weil du Spalten selektierst, über die du nicht gruppiert hast.
    Nach SQL-Standard ist das verboten, würde dir einen Fehler liefern; MySQL erlaubt es trotzdem, liefert dir dann aber „zufällige“ Werte für diese Spalten.

    http://dev.mysql.com/doc/refman/5.0/...group-row.html
    Mit einem dieser Ansätze die maximal erreichte Punktzahl je Benutzer ermitteln. Anschließend noch wie gewünscht sortieren.

    Kommentar


    • #3
      Subselect verwendet

      Hallo

      Danke für den Hinweis. Hab den Select nun wie folgt abgeändert:

      SELECT benutzernamen, datum, punkte, zeit FROM user_quiz as s1
      where punkte = (SELECT max(s2.punkte) from user_quiz where s2.benutzernamen = s1.benutzernamen)
      GROUP BY benutzernamen
      ORDER BY benutzernamen DESC, punkte DESC, zeit ASC;

      Das resultat ist dann wie folgt:


      Rang BENUTZERNAMEN Datumt Punkte Zeit
      1 fluryk 2011-11-13 21:21:41 6 00:22
      2 admin2 2011-11-01 12:06:40 5 00:33
      3 fluku 2011-11-13 20:42:37 5 00:35

      Eigentlich genau das was ich will. Komisch ist nur, das mir wie in der Ausgangslage oben gezeigt der admin1 nicht ebenfalls angezeigt wird.

      Sieht jemand woran das liegt?

      Kommentar


      • #4
        kleine korrektur: Bezüglich des oben genannten selects habe ich den alias s2 noch vergessen anzugeben. das resultat ist aber das selbe:

        SELECT benutzernamen, datum, punkte, zeit FROM user_quiz as s1
        where punkte = (SELECT max(s2.punkte) from user_quiz as s2 where s2.benutzernamen = s1.benutzernamen)
        GROUP BY benutzernamen
        ORDER BY benutzernamen DESC, punkte DESC, zeit ASC;

        Was nun?

        Kommentar


        • #5
          Problem ist gelöst. Das oben stehende satement war richtig bzw. das Problem lag noch wo anders. Vielen Dank an Chris für seine Hilfe.

          Gruss

          Kommentar

          Lädt...
          X