MichaelR: MySQL: Ergebnisse einer Abfrage gruppieren -- Alternative?

Hallo,

es liegt eine Tabelle vor mit diversen Feldern, u. a. "Id" und "Timestamp".
Die einzelnen Datensätze können im Feld "Id" den selben Wert enthalten und gehören damit sachlich zusammen -- bilden praktisch eine 'Gruppe'. Bei der SELECT-Abfrage soll jedoch immer nur der neueste Datensatz aus einer solchen Gruppe ausgegeben werden.

Mein SELECT Befehl enthält eine GROUP By-Klausel, in der nach der Id gruppiert wird. Das Problem ist allerdings, dass nicht der neueste Datensatz, sondern immer der erste (älteste) ausgegeben wird.

Wie kann ich das dann änder? Eine ORDER By-Klausel bewirkt nichts. Hab ich schon versucht.

Danke + Grüße
Michael

  1. Glück auf!

    Wie sieht denn dein Statement bisher aus?
    Auf die Schnelle und ungetestet würde ich sowas vorschlagen:

      
    select max(timestamp), id  
    from table  
    group by id  
    
    

    Das gibt dann zu jedern ID den höchsten Timestamp aus.

    Gruß,
    der Juve

    1. Hi,

      Glück auf!

      Leider net :(

      Wie sieht denn dein Statement bisher aus?

      Das Select gibt lediglich alle Felder aus.

      Das mit max() funktioniert lieder nicht, weder in der SELECT noch in der WHERE Klausel.

      Das Problem ist, dass es zu jeder ID mehrere Datensätze mit unterschiedlichen Zeitstempeln geben kann. Und von diesen soll jeweils nur der aktuellste genommen werden....

      Any ideas?

      Danke + Grüße
      Michael

      1. Hallo,

        Das Problem ist, dass es zu jeder ID mehrere Datensätze mit unterschiedlichen Zeitstempeln geben kann. Und von diesen soll jeweils nur der aktuellste genommen werden....

        GROUP BY ist dafür *keine* Lösung :-)

        Any ideas?

        Dieses Standardproblem löst man mit korrelierten Unterabfragen, siehe z.B. </archiv/2006/7/t133015/#m861544>

        Freundliche Grüße

        Vinzenz

        1. Hi,

          Dieses Standardproblem löst man mit korrelierten Unterabfragen, siehe z.B. </archiv/2006/7/t133015/#m861544>

          Super -- genau das hilft! Merci

          Grüße
          Michael

      2. Glück auf!

        Any ideas?

        Klingt so, als wäre in deiner Tabelle id und timestamp der konkatenierte Primary Key. Mit meinem bereits genannten Statement bekommt du ja zu jeder ID den höchsten (=jüngsten) Timestamp. Dann musst du mit diesem Ergebnis letztlich nur nochmal auf deine Ursprungstabelle joinen und die beiden Felder als Join-Bedingung wählen. Ich bin nur leider nicht sicher, ob MySQL das kann, würde mich aber wundern, wenn nicht:

          
        select t.*  
        from mytable t  
            join (  
                select max(ts) maxts, id  
                from mytable  
                group by customer_id  
                ) b on t.ts=b.maxts and t.id=b.id  
        
        

        Gruß,
        der Juve

        1. P.S.: Ja, ich weiß, "select *" ist böse soll hier nur zu Anschauungszwecken dienen.
          P.P.S.: Der Code ist TransactSQL, mag sein, dass die MySQL-Syntax ggfs. abweicht.