Sortieren von GROUP BY (oder Alternativen)

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

  • Sortieren von GROUP BY (oder Alternativen)

    Hallo. Ich muss sagen, ich bin in SQL nicht besonders firm. Stehe jetzt schon seit einiger Zeit vor einem Problem, das ich nicht wirklich gelöst bekomme. Habe folgende Tabellenstruktur:
    id
    kommentar
    zeit
    mitglieder_id
    beitraege_id
    bearbeiten_zeit

    Diese Zeilen sind über beitraege_id einer Tabelle beitraege zugeordnet. Es kann für jeden Beitrag mehrere Datensätze in dieser Tabelle geben. Jetzt möchte ich für jeden Beitrag den Kommentar auslesen mit der höchsten Zeit. Mit GROUP BY finde ich keine vernünftige Lösung, den jeweils aktuellsten Eintrag auszulesen. Hatte das auf meinem Testsystem dann mit einem Subselect gelöst, funktionierte sogar so weit. Nur leider fährt der Server, auf dem das laufen soll noch MySQL 4.0, was sich auch nicht so schnell ändern wird. Hat vielleicht jemand noch einen Lösungsansatz für mich?

  • #2
    Entweder mit max ()

    oder Select mit order by zeit desc limit 0,1

    Kommentar


    • #3
      Naja, damit bekomme ich halt leider nur den jeweilig höchsten Wert. Man stelle sich aber mal vereinfacht folgenden Inhalt vor:

      beitraege_id bearbeiten_zeit .....
      1 01.01.2006
      2 05.02.2006
      2 05.02.2006
      1 10.02.2006
      2 01.03.2006

      Ich will ja nun den jeweilig höchsten Eintrag für jeden Beitrag. Also für ID 1 den 10.02. und für ID 2 den 01.03. In Wirklichkeit handelt es sich natürlich um deutlich mehr Beiträge und zugehörige Zeilen.

      Kommentar


      • #4
        SELECT id, max(date) FROM `test` group by id

        Nei so bekommst du alle auch bei dem verwendeten Format.

        So getestet:
        PHP-Code:
        CREATE TABLE `test` (
          `
        idtinyint(3unsigned default '0',
          `
        datechar(10) default NULL
        TYPE=MyISAM
        PHP-Code:
        INSERT INTO test (iddateVALUES (1'10.02.2005')
        INSERT INTO test (iddateVALUES (1'11.02.2006')
        INSERT INTO test (iddateVALUES (2'01.01.2005')
        INSERT INTO test (iddateVALUES (2'01.01.2006'
        liefert:

        mysql> SELECT id, max(date) FROM `test` group by id;
        +------+------------+
        | id | max(date) |
        +------+------------+
        | 1 | 11.02.2006 |
        | 2 | 01.01.2006 |
        +------+------------+
        2 rows in set (0.00 sec)

        das was du suchst.

        Kommentar


        • #5
          Das funktioniert aber leider nur, solange ich nur dieses eine Feld abfrage. Möchte ich mehrere Felder erhalten, mixt er die wild durch.

          Code:
          CREATE TABLE `test` (
          `id` TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
          `kommentar` VARCHAR( 255 ) NOT NULL ,
          `zeit` DATE NOT NULL ,
          `mitglieder_id` TINYINT NOT NULL ,
          `beitraege_id` TINYINT NOT NULL ,
          `bearbeiten_zeit` DATE NULL
          ) ;
          
          
          SELECT *
          FROM `test`;
          	
          id   kommentar   zeit         mitglieder_id   beitraege_id   bearbeiten_zeit
          1    aaaaa       2006-05-02   1               1              NULL
          2    bbbbb       2006-05-10   2               2              NULL
          3    ccccc       2006-05-04   3               1              NULL
          4    ddddd       2006-05-25   4               2              NULL
          5    eeeee       2006-05-10   5               2              NULL
          6    fffff       2006-05-01   6               1              NULL
          
          SELECT id, kommentar, MAX(zeit), mitglieder_id, beitraege_id 
          FROM `test` 
          GROUP BY beitraege_id;
          	
          id   kommentar   MAX( zeit )   mitglieder_id   beitraege_id
          1    aaaaa       2006-05-04    1               1
          2    bbbbb       2006-05-25    2               2

          Kommentar

          Lädt...
          X