Announcement

Collapse
No announcement yet.

Filtern nach GROUP BY

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Filtern nach GROUP BY

    Hallo zusammen

    Ich habe eine Tabelle, welche Dateien auflistet mit Dateinamen und Upload-TimeStamp.

    Nun möchte ich ein SELECT-Statement erstellen, welches mir jeweils die Dateien ausgibt mit dem neuesten TimeStamp.

    Die Tabelle sieht wie folgt aus ...
    Code:
    CREATE TABLE IF NOT EXISTS `files` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `fn` varchar(255) NOT NULL,
      `type` varchar(100) NOT NULL,
      `title` varchar(255) NOT NULL,
      `comment` text NOT NULL,
      `uploader` int(4) NOT NULL,
      `ts_uploaded` int(11) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC COMMENT='Datei-Uploads' AUTO_INCREMENT=4 ;
    
    INSERT INTO `files` (`id`, `fn`, `type`, `title`, `comment`, `uploader`, `ts_uploaded`) VALUES
    (1, 'tennisball.jpg', 'image/jpeg', 'Tennisball', 'Ein Gelber runder Ball', 2, 1244912922),
    (2, 'baseball.jpg', 'image/jpeg', 'Baseball', 'Ein runder Ball zum Spielen ...', 2, 1244914293),
    (3, 'baseball.jpg', 'image/jpeg', 'Baseball V2', 'Neuer Version ...', 2, 1244914345);
    ... nun möchte ich, dass der Tennisball angezeigt wird und die V2 vom Baseball ...

    Als Ansatz habe ich mit GROUP BY fn mal gefiltert und nun müsste ich da noch definieren können, dass der mir den V2 vom Baseball nimmt und nicht den andern.

    Hat jemand eine Idee, wie das machbar ist?

    Danke im Voraus
    CRA

  • #2
    Hi,

    zu allererst die Backticks um die Objekt- und Spaltennamen brauchst Du nicht auch wenns leider immer wieder so gemacht wird.

    Zu deiner Frage:
    Gefitert wird immer mit WHERE bzw. wenn Du auf das Ergebnis einer Aggregatsfunktion einschränken möchtest mit HAVING.
    GROUP BY filtert nicht sondern gruppiert gleichartige Werte. Alle Spalten, die nicht im GROUP BY auftauchen müssen in eine Aggegatsfunktion (SUM,. MAX, MIN etc.) ansonsten ist das SQL nicht gültig (ältere mysql Versionen haben leider die Angewohnheit, diesen Fehler zu unterdrücken und die GROUP BY Klausel im Hintergrund selbst zu vervollständigen, was allerdings hin und wieder zu seltsamen ergebnissen führt).

    nun möchte ich, dass der Tennisball angezeigt wird und die V2 vom Baseball ...
    Anders ausgedrückt, Du möchtest, dass bei gleichem Dateinamen immer der neuere Wert angezeigt wird? Hab ich das richtig interpretiert?

    Das würde dann so aussehen:
    Code:
    select max(ts_uploader),fn from files GROUP BY fn
    Wenn Du den kompletten Datenstz sehen möchtest, dann mustt diese Ergebnismenge in ein Subselect packen:
    Code:
    select * from  files,
                  (select max(ts_uploader),fn from files GROUP BY fn) max_values
    where files.fn=max_values.fn
    Dim
    Zitat Tom Kyte:
    I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

    Comment


    • #3
      Hallo dimitri

      Danke für deine Antwort. Das mit den Backticks mach ich eigentlich auch nur, wenn's sein muss, Das hier ist einfach nur ein phpMyAdmin-Auszug, der das halt so macht

      Deine Lösung funktioniert so leider nicht, da du dich im Where auf den fn (filename) beziehst, der ja bei allen Versionen gleich ist. Dank deinem Ansatz konnt ich das nun selber soweit umformen, dass es passt:
      Code:
      SELECT *
      FROM files, (
      
      SELECT max( ts_uploaded ) ts
      FROM files
      GROUP BY fn
      )max_values
      WHERE files.ts_uploaded = max_values.ts
      Danke nochmals und ein schönes Weekend (oder was davon noch übrig bleibt.
      Gruss CRA

      Comment

      Working...
      X