Ankündigung

Einklappen
Keine Ankündigung bisher.

MySQL: Neuste Datensätze statt älteste

Einklappen

Neue Werbung 2019

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

  • MySQL: Neuste Datensätze statt älteste

    Hallo Com!

    Habe ein kleines Problem mit einem Statistikprogramm. Und zwar habe ich in einer Tabelle das Bankguthaben von verschiedenen Spielern zu verschiedenen Zeiten auf verschiedenen Banken. Ein Script füttert die Datenbank stündlich mit dem Guthabenstand der Spieler. Damit soll dann später eine Statistik möglich sein. Momentan brauche ich aber immer nur den aktuellsten Stand.

    Code:
    id || datum        || player    || bank        || guthaben
    1  || 01.01.2015    || Hans        || Deutschland    || 5000
    2  || 01.01.2015    || Thomas    || USA        || 2500
    3  || 01.01.2015    || Hans        || Schweiz    || 1000
    4  || 05.05.2015    || Hans        || Deutschland    || 10000
    usw.
    Wenn ich jetzt die Daten auslese:

    Code:
    SELECT * FROM tabelle GROUP BY player, bank
    Dann wird mir für jeden Spieler und für jede Bank nur die jeweils ältesten Einträge angezeigt. Wie bekomme ich die jeweils aktuellsten Einträge?

    Vielen Dank im Voraus

  • #2
    ORDER BY datum DESC

    Kommentar


    • #3
      Das habe ich schon probiert, leider gibt er mir immer noch den ältesten Eintrag aus.

      Kommentar


      • #4
        Zitat von Arne Drews Beitrag anzeigen
        ORDER BY datum DESC
        Er will das je Spieler.Also will er aggregieren und gruppieren.

        Kommentar


        • #5
          Genau, am besten pro Spieler gruppieren.

          Hans:
          Deutschland 10000
          Schweiz 1000

          Und die Banken am besten auch aufsteigend sortieren. Wie funktioniert das?

          Kommentar


          • #6
            aggregieren, gruppieren, sortieren. Der klassische DB-Dreikampf.

            Kommentar


            • #7
              Folgendes funktioniert leider auch nicht:
              Code:
              SELECT * FROM tabelle WHERE datum = MAX(datum) GROUP BY player, bank
              Kann mir denn niemand helfen? Ich verzweifle hier noch

              Kommentar


              • #8
                Hast schon mal "funktioniert leider auch nicht" bei Googel eingegeben? Das Problem haben viele, das findest ganz sicher eine passende Antwort.

                Abfragen mit Aggregation / Gruppierung müssen eine Regel genügen: alle Spalten des Results müssen entweder aggregiert oder gruppiert sein. Mit select * wird das schon mal nix, zumal Du eine PK-Spalte hast. Versuch das einfach mal rein logisch zu verstehen.

                Kommentar


                • #9
                  Keine Sorge, ich google schon den ganzen Tag nach dem Problem, ist nicht so, dass ich auf der faulen Haut liege und hier ne perfekte Lösung erwarte. Ich habs jetzt jedenfalls so lösen können:
                  Code:
                  SELECT a.* FROM activity as a WHERE a.datum IN (SELECT MAX(datum) FROM activity GROUP BY player) GROUP BY player, bank
                  Elegantere Lösungen oder Verbesserungen im Stil nehm ich gerne entgegen.

                  Kommentar


                  • #10
                    was spricht gegen select player, bank, max(datum) from ... group by player, bank order by ... ?

                    Deine Lösung scheitert oder liefert Murks, wenn 2 Records dasselbe max(datum) haben.

                    Kommentar


                    • #11
                      Zitat von akretschmer Beitrag anzeigen
                      was spricht gegen select player, bank, max(datum) from ... group by player, bank order by ... ?
                      Dass es nur Murks liefert. Dass es immer noch den ältesten Eintrag auswählt, nur eben als Datum den des neusten Eintrags liefert.
                      Deine Lösung scheitert oder liefert Murks, wenn 2 Records dasselbe max(datum) haben.
                      Das ist kein Problem. Das Script, dass die DB mit Daten füttert, arbeitet so, dass nie zwei das selbe max(datum) haben.

                      Kommentar


                      • #12
                        Ja, mysql kann keine Gruppensortierung per se. Kannst du dir mit sub-selects zusammenfuchsen. Oder du nimmst ein RDBMS, dass das kann: PostgreSQL (verhält sich zu MySQL die C zu Windows-Batch).

                        That said: http://www.xaprb.com/blog/2006/12/07...-group-in-sql/

                        Kommentar


                        • #13
                          Oder anstatt ein Datum zu nehmen nimmst du ein Timestamp, dann kannst du das doch perfekt als order by machen ? kannst ja den tag von timestamp bis timestamp ja dann da auch unterbringen.
                          php -> date('parameter', $timestamp);
                          Sortiert und mit datum...

                          Außerdem kann man nicht erkennen welche Struktur diese MySQL Tabelle hat und welche Typen verwendet werden (bsp. varchar(x) oder int(x)), weil da kann es schonmal vorkommen das man des öfteren ' ' benötigt?

                          Grüße theredox

                          Kommentar


                          • #14
                            Zitat von theredox
                            Oder anstatt ein Datum zu nehmen nimmst du ein Timestamp, dann kannst du das doch perfekt als order by machen ?
                            Inwiefern kann man ein INT besser sortieren als ein DATETIME?

                            Kommentar


                            • #15
                              Zitat von rkr Beitrag anzeigen

                              Inwiefern kann man ein INT besser sortieren als ein DATETIME?
                              Wo ist da denn da ein DATETIME ich sehe nur DATE? Ich weiss ja nicht was er für Typen benutzt...

                              Ein DATE(TIME) würde zum sortieren auch so aussehen müssen, YYYY-MM-DD und nicht wie in der Tabelle dargestellt, so lässt sich nämlich gar nichts sortieren ...
                              Amerikanische Reihenfolge wäre schonmal ein Ansatz...

                              Und wenn der Datentyp verwendet werden soll dann auch idealerweise vollständig, sonst spinnt wohl die sortiererei weiter rum...

                              Kommentar

                              Lädt...
                              X