Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] SELECT MAX(datum) ....

Einklappen

Neue Werbung 2019

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

  • [Erledigt] SELECT MAX(datum) ....

    Hallo Freunde der schoenen Datenbank,

    ich hab hier mal ein Problem *puh* und versuche mit meinen rudimentaeren MySQL Kenntnissen dieses in den Griff zu bekommen. Trotzdem erbitte ich Eure Hilfe. Hier ein kleiner Versuch das Prob zu umschreiben.

    Ich schreibe eine Anwendung (eine Art Freigabe- und Testmanagement in PHP mit MySQL) in der die User ihren taeglichen Teststatus fuer ihre Testprogramme hinterlegen koennen. Auf der Seite soll der Vortagesstatus und der aktuelle Tagesstatus angezeigt werden. Hierzu habe ich eine Tabelle in der der Programmname, das Datum und der Status abgelegt werden. fuer jeden neuen Tag wird eine Spalte mit Programmnamen, Datum und Status angelegt, fuer Aenderungen am gleichen Tag wird nur ein Update der Spalte vorgenommen (ich hoffe ihr kommt noch mit ).

    Die Probs fangen schon damit an, dass ich nur den Programmstatus eines Programms mit dem hoechsten Datum herausfiltern moechte (SELECT * FROM daily_status GROUP BY datum HAVING MAX(datum)). Das klappt aber nicht, da bekomme ich mehr Ergebnisse als ich eigentlich moechte. Hm, alternativ koennte ich alle Stati von einem Programm anzeigen lassen und dann einfach nur den letzten Eintrag davon nehmen.

    Ok, ich hoffe ich habe jetzt alle Verwirrt

    Vielen Dank schon mal fuer jeden Hilfe jeglicher Art

    Gruessle
    bio*

    Hier noch ein paar Infos:
    System: NT 4.0
    PHP: 4.3.2-RC1
    MySQL: 4.0.12-nt

  • #2
    Mit
    Code:
    SELECT * 
        FROM daily_status 
        HAVING datum = MAX(datum)
    müsste das gehen. Das bringt dir die Zeile mit dem neusten Datum. Mit
    Code:
    SELECT * 
        FROM daily_status 
        GROUP BY programm 
        HAVING datum = MAX(datum)
    erhälst du den neusten Status jedes Programms
    Gruss
    L

    Kommentar


    • #3
      Danke fuer die schnelle Hilfe lazydog,

      leider funzt es so auch nicht. Bei erstem Schnipsel gibt er leider gar nichts aus (obwohl er hier doch wenigstens die eine Zeile mit dem hoechsten Datum ausgeben sollte ) und bei zweitem alles ohne die aktuallisierten Programme (also die, die schon einen Test am Vortag hatten) und wieso nur die das versteh ich nicht.

      Ich glaub ich hol mir erst mal ne Tasse (oder lieber ne Kanne ?) Kaffee

      Wer mag dem schick ich auch gerne die SQL Files vom Aufbau der Tabelle mit Beispielfuellung

      Trotzdem vielen Dank
      Gruessle
      bio*

      Kommentar


      • #4
        Ich hab das mit einer Beispieltabelle ausprobiert, sowohl mit timstamp als auch mit datetime und es funktionier. Ich weiss nicht, was du für Datentypen verwendest, bei Strings könnte es ev. Probleme geben. Zeige doch mal deine Tabellenaufbau (SHOW CREATE TABLE daily_status).
        Gruss
        L

        Kommentar


        • #5
          S,

          hiermal die Beispieltabelle
          Code:
          DROP TABLE IF EXISTS daily_status;
          
          CREATE TABLE daily_status (
            programm VARCHAR(50),
            datum DATE,
            dstatus VARCHAR(5)
          );
          
          INSERT INTO daily_status VALUES
            ('bzflag', '2004-07-14', 'rot'),
            ('cube', '2004-07-14', 'rot'),
            ('tux racer', '2004-07-14', 'rot'),
            ('bzflag', '2004-07-15', 'gelb');
          und hier der SELECT Befehl mit dem es funzt so wie ich es gerne haette
          Code:
          SELECT programm, MAX(datum), dstatus FROM daily_status GROUP BY programm;
          und der Befehl bei dem leider nichts bei raus kommt der mir aber lieber waere wegen dem *
          Code:
          SELECT * FROM daily_status GROUP BY programm HAVING MAX(datum);
          Und hier die Ausgabe von MySQL bei der Anwendung der Befehle
          Code:
          mysql> SELECT programm, MAX(datum), dstatus FROM daily_status GROUP BY programm;
          +-----------+------------+---------+
          | programm  | MAX(datum) | dstatus |
          +-----------+------------+---------+
          | bzflag    | 2004-07-15 | rot     |
          | cube      | 2004-07-14 | rot     |
          | tux racer | 2004-07-14 | rot     |
          +-----------+------------+---------+
          3 rows in set (0.00 sec)
          
          mysql> SELECT * FROM daily_status GROUP BY programm HAVING MAX(datum);
          Empty set (0.00 sec)
          Und ich sehe, dass das Ergebniss falsch ist, da bzflag am 15. auf gelb sein sollte *nark*

          Gruessle
          bio*

          Kommentar


          • #6
            Das Resultat von
            Code:
            SELECT programm, MAX(datum), dstatus 
                FROM daily_status 
                GROUP BY programm;
            ist nicht falsch, sondern einfach unsinnig. Die meisten DB-Systeme (z.B. Oracle, Sybase u.a.) lassen diese Abfrage gar nicht zu. Der Status ist ja kein Gruppierungskriterium, und da MySQL ja nicht wissen kann, welcher Status gemeint ist, nimmt es halt einfach den erstbesten.
            Den ersten Code habe ich dir ja schon vorher korrigiert (habe ich gemeint):
            Code:
            SELECT * 
                FROM daily_status 
                GROUP BY programm 
                HAVING datum = MAX(datum);
            Allerdings habe ich nun gesehen, dass die Ausgabe bei deinen Daten auch nicht korrekt ist. Es kommen nur die Zeilen mit einem einzigen Eintrag. Ich verstehe das nicht und zweifle immer etwas mehr an MySQL, v.a. weil
            Code:
            SELECT programm, datum, dstatus 
                FROM daily_status
                GROUP BY programm desc
                HAVING min(datum) = datum
            genau so wie erwartet funktioniert. Aber vielleicht weiss sonst jemand, warum das so ist.
            Gruss
            L

            Kommentar

            Lädt...
            X