Highscore Top Heute ausgeben - Falsche Werte

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

  • Highscore Top Heute ausgeben - Falsche Werte

    Hallo,

    folgende Einträge in der Datenbank:

    highscores

    userid | username | score | time | created
    ----------------------------------------
    1 | abc | 120 | 4 | <timestamp>
    2 | cde | 150 | 5 | <timestamp>
    3 | abc | 130 | 4 | <timestamp>
    4 | abc | 120 | 5 | <timestamp>
    5 | abc | 360 | 10 | <timestamp>
    ...
    mit meinem Query

    Code:
    SELECT `username`, MAX(`score`) as max_score, `time`, FROM `highscores` WHERE DATE_FORMAT(`created`, '%Y-%m-%d') = DATE_FORMAT(NOW(), '%Y-%m-%d') GROUP BY `userid` ORDER BY max_score DESC LIMIT 10
    will ich bewirken, dass nur der Beste Score (MAX) eines Users heute aufgelistet werden soll. Außerdem soll noch die benötigte Zeit sowie Benutzername ausgegeben werden.

    Das Query funktioniert aber nicht richtig. Er zeigt mir zwar den höchsten Score in Kombination mit dem Benutzer an, aber leider zum Score die falsche Zeit "time" (=Zeit die User gebraucht hat). Er listet irgendeine andere Zeit des Benutzers (heute) auf. Warum? Könnt ihr mir helfen?

    Gruß,

  • #2
    Code:
    SELECT h1.userid, h1.username, h1.created, h1.score as max_score
    FROM highscores h1
    LEFT JOIN highscores h2 ON ( h2.userid = h1.userid AND h2.score > h1.score )
    WHERE DATE(h1.created) = CURRENT_DATE() AND h2.userid IS NULL
    ORDER BY h1.score DESC LIMIT 10
    http://dev.mysql.com/doc/refman/5.0/...group-row.html
    Zuletzt geändert von h3ll; 16.08.2012, 19:56.

    Kommentar


    • #3
      Hey,

      danke für deine Mühe!

      Wenn ich das Query testweise ausführe erhalte ich immer ein leeres Result zurück. Ich bin mir nicht sicher warum?

      Gruß

      Kommentar


      • #4
        Dann poste bitte mal Testdaten (SQL Dump).

        Kommentar


        • #5
          INSERT INTO `highscore` (`hid`, `husername`, `huserid`, `hscore`, `htime`, `hcreated`) VALUES
          (1, 'Name1', 100675, 310, 191, '2012-08-15 16:15:47'),
          (2, 'Name2', 11, 30, 71, '2012-08-15 20:51:44'),
          (3, 'Name2', 11, 40, 41, '2012-08-15 21:21:38'),
          (4, 'Name2', 11, 30, 96, '2012-08-16 16:43:22'),
          (5, 'Name2', 11, 41, 218, '2012-08-16 16:47:13'),
          (6, 'Name2', 11, 43, 208, '2012-08-16 16:55:53');
          Bitte
          Zuletzt geändert von mietz; 16.08.2012, 21:13.

          Kommentar


          • #6
            Code:
            SELECT h1.huserid, h1.husername, h1.htime, h1.hscore
            FROM highscore h1
            LEFT JOIN highscore h2 ON (
                h2.huserid = h1.huserid AND DATE(h2.hcreated) = DATE(h1.hcreated) AND h2.hscore > h1.hscore
            )
            WHERE DATE(h1.hcreated) = CURRENT_DATE() AND h2.huserid IS NULL
            ORDER BY h1.hscore DESC LIMIT 10;

            Kommentar


            • #7
              Ach das ist ja super! Vielen Dank Warum kann man es denn nicht so lösen wie ich oben bzw. warum funktioniert es nicht?

              Kommentar


              • #8
                Weil alle Spalten, die du im SELECT auswählst, eigentlich auch im GROUP BY stehen sollten, ansonsten kann die Datenbank oft kein eindeutiges Ergebnis liefern.

                Jede andere Datenbank würde dir eine Fehlermeldung auf den Kopf werfen, nur MySQL ist das egal und liefert halt _irgendwas_.

                Kommentar


                • #9
                  Hallo h3ll,

                  ich habe noch eine Frage:

                  Gleiche Tabelle und nun würde ich gerne eine Hall of Fame machen.

                  Mit

                  Code:
                  SELECT tabelle1.huserid, tabelle1.husername, tabelle1.htime, tabelle1.hscore, tabelle1.hscore as max_score
                                                                      FROM highscore tabelle1
                                                                      LEFT JOIN highscore tabelle2 ON (
                                                                          tabelle2.huserid = tabelle1.huserid AND tabelle2.hscore > tabelle1.hscore
                                                                      )
                                                                      WHERE tabelle2.huserid IS NULL
                                                                      GROUP BY tabelle1.huserid
                                                                      ORDER BY tabelle1.hscore DESC LIMIT 20;
                  kriege ich zwar die (vermeindlich) korrekte Auflistung allerdings passen wieder die Zeiten nicht zu den gesetzten Scores.

                  Könntest du mir ggf. nochmal helfen?

                  Kommentar


                  • #10
                    Kann eigentlich nicht sein. Poste mal einen Datenbankdump mit Beispieldaten und das Ergebnis, das du dir erwarten würdest.

                    Kommentar

                    Lädt...
                    X