lars: mysql: datensatz anhand des timestamp finden

hallo zusammen,

ich habe folgendes problem:
ich habe eine tabelle mit folgendem grobem aufbau
1. id
2. name
3. info
4. timestamp

ich möchte nun zu jedem namen den letzten eintrag haben, sprich den mit dem jeweils höchsten timestamp.

SELECT name, info FROM infotabelle WHERE ???

aber was muss nun in den where teil?

hat jemand von euch eine idee?

mfg

lars

  1. hallo zusammen,

    ich habe folgendes problem:
    ich habe eine tabelle mit folgendem grobem aufbau

    1. id
    2. name
    3. info
    4. timestamp

    ich möchte nun zu jedem namen den letzten eintrag haben, sprich den mit dem jeweils höchsten timestamp.

    SELECT name, info FROM infotabelle WHERE ???

    aber was muss nun in den where teil?

    hat jemand von euch eine idee?

    mfg

    lars

    Hallo Lars,

    nicht "where" ist dein statement, sondern "order by" :-).
    Auf gut deutsch:
    Mit "where" fragst du Datensätze mit einem bestimmten gesetzten Feldwert ab, mit "order by" kannst du Ergebnisse sortieren.
    Wenn du das ganze jetzt noch mit "limit" einschränkst, kannst du dir immer den letzten (aktuellsten) Datensatz raussuchen lassen.

    Gruss
    Didi

    1. Hallo Didi,

      ich habe eine tabelle mit folgendem grobem aufbau

      1. id
      2. name
      3. info
      4. timestamp

      ich möchte nun zu jedem namen den letzten eintrag haben, sprich den mit dem jeweils höchsten timestamp.

      nicht "where" ist dein statement, sondern "order by" :-).

      leider ist das falsch. WHERE ist genau richtig, ORDER BY hilft in diesem Fall überhaupt nicht.

      Mit "where" fragst du Datensätze mit einem bestimmten gesetzten Feldwert ab, mit "order by" kannst du Ergebnisse sortieren.

      Du sagst es ja selbst: Mit WHERE filtert man Datensätze - und das möchte der OP. Er möchte zu jedem Namen nur den Datensatz mit dem höchsten Timestamp.

      Wenn du das ganze jetzt noch mit "limit" einschränkst, kannst du dir immer den letzten (aktuellsten) Datensatz raussuchen lassen.

      Nein, das funktioniert nicht. Warum? Ganz einfach:

      1. Möglichkeit:
      Sortiere zuerst nach Namen, dann nach Timestamp. Du hast nun alle Einträge zu einem bestimmten Namen wunderbar beisammen. Wie willst Du mit LIMIT zu jedem einzelnen Namen genau einen Datensatz erhalten? Es geht einfach nicht.

      2. Möglichkeit:
      Sortiere erst nach Timestamp, dann nach Namen. Woher kennst Du die Anzahl der verschiedenen Namen? Kannst Du dir sicher sein, dass bei den höchsten Timestamps nicht ein Name doppelt auftaucht? nein, kannst Du nicht. Geht also auch nicht.

      3. Möglichkeit:
      Du könntest argumentieren: Aber da gibt es doch noch GROUP BY.
      Das geht auch nicht, da Du über die Spalte info nicht sinnvoll gruppieren kannst. Da aber die Info aus der Spalte info essentiell ist, geht es nicht.

      Wie es geht, habe ich in https://forum.selfhtml.org/?t=124769&m=804136 beschrieben.

      Freundliche Grüße

      Vinzenz

  2. Hallo Lars,

    ich habe eine tabelle mit folgendem grobem aufbau

    1. id
    2. name
    3. info
    4. timestamp

    ich möchte nun zu jedem namen den letzten eintrag haben, sprich den mit dem jeweils höchsten timestamp.

    wie bei MySQL üblich, ist die Lösung von Deiner MySQL-Version abhängig. Wenn Du MySQL 4.1.x verwendest, so ist diese Aufgabe einfach mit einem Subselect lösbar:

      
    SELECT  
      name,  
      info  
    FROM tabelle t1             -- Vergabe Aliasnamen, da zweimal auf die gleiche  
                                -- Tabelle zugegriffen wird  
    WHERE timestamp = (         -- Wähle den Eintrag mit  
      SELECT MAX(t2.timestamp)  -- dem höchsten Timestamp aus  
      FROM tabelle t2           --  
      WHERE t1.name = t2.name   -- zu jedem Namen  
    )  
    
    

    Bitte gib uns daher Deine MySQL-Version an.

    Freundliche Grüße

    Vinzenz

    1. SELECT
        name,
        info
      FROM tabelle t1             -- Vergabe Aliasnamen, da zweimal auf die gleiche
                                  -- Tabelle zugegriffen wird
      WHERE timestamp = (         -- Wähle den Eintrag mit
        SELECT MAX(t2.timestamp)  -- dem höchsten Timestamp aus
        FROM tabelle t2           --
        WHERE t1.name = t2.name   -- zu jedem Namen
      )

        
      Vielen Dank für eure hinweise, ich nutze die 5er version, daher sind subqueries kein problem. ich hatte es schonmal damit versucht, aber der where teil im subquery war bei mir falsch ...  
        
      mfg  
        
      lars