mabu: MySQL: GROUP BY

Hallo!

Ich habe eine Frage zum GROUP BY bei MySQL.

Ich habe folgende Tabellen:

kategorie:
id|name
------------
1|sport
2|politik
3|wirtschaft

eintrag:
id|kategorie|time
-----------------
1|2|23
2|3|12
3|2|48
4|1|13

Ich will nun alle Kategorien abrufen, geordnet nach dem Eintragsdatum des letzten Eintrages. Als Datum wird Unixtime verwendet, hab hier einfach kleinere Zahlen genommen.

SELECT kategorie.*, eintrag.id FROM kategorie, eintrag
WHERE eintrag.kategorie = kategorie.id
GROUP BY kategorie.id
ORDER BY eintrag.time DESC

Jedoch bekomme ich hier unter "eintrag.time" immer die Zeit des ersten passenden Eintrages, nicht die des letzten.
Ich bräuchte also ein GROUP BY, welches jedoch aus anderer Richtung vorgeht, wenn man das so sagen kann.

Geht sowas, oder muss hier mit komplizierteren Strukturen gearbeitet werden? Mit JOINS etc. habe ich keine Erfahrung, deshalb diese Lösung.

Danke auf jeden Fall schonmal fürs Lesen!

mfg,
mabu

  1. Hi,

    Ich habe eine Frage zum GROUP BY bei MySQL.

    aus irgendwelchen Gründen erlaubt MySQL die völlig unsinnige Konstellation, Spalten zu selektieren, die nicht in der GROUP BY Klausel aufgelistet werden. Andere DBMSse liefern bei so etwas gnadenlos einen Fehler, weil im Grunde kein Weg existiert, einen derartigen Widerspruch aufzulösen.

    SELECT kategorie.*,

    Zusätzlich: Die Selektierung pauschal jeder Spalte einer Tabelle ist nicht praxistauglich.

    Jedoch bekomme ich hier unter "eintrag.time" immer die Zeit des ersten passenden Eintrages, nicht die des letzten.

    Da die o.g. Konstellation nicht deterministisch ist, muss MySQL zwangsläufig rein zufällige Ergebnisse liefern. Richte Dich nach dem, was andere DBMSse mit dem Fall machen, und betrachte Dein SQL-Statement als grob fehlerhaft. Wenn Du gruppierst, dann nach *allen* Spalten, die Du selektierst.

    Ich bräuchte also ein GROUP BY, welches jedoch aus anderer Richtung vorgeht, wenn man das so sagen kann.

    Nein, das kann man nicht sagen. GROUP BY gruppiert die Daten nach angegebenen Kriterien. Eine Richtung existiert nicht.

    Geht sowas, oder muss hier mit komplizierteren Strukturen gearbeitet werden?

    Oder.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Zusätzlich: Die Selektierung pauschal jeder Spalte einer Tabelle ist nicht praxistauglich.
      Da die o.g. Konstellation nicht deterministisch ist, muss MySQL zwangsläufig rein zufällige Ergebnisse liefern. Richte Dich nach dem, was andere DBMSse mit dem Fall machen, und betrachte Dein SQL-Statement als grob fehlerhaft. Wenn Du gruppierst, dann nach *allen* Spalten, die Du selektierst.

      Danke für die Antwort, aber irgendwie kapier ich trotzdem noch nicht, wie ich das nun lösen soll.

      Laut deiner Aussage müsste mein SQL Statement nun so aussehen:

      SELECT kategorie.id, kategorie.name, eintrag.id FROM kategorie, eintrag
      WHERE eintrag.kategorie = kategorie.id
      GROUP BY kategorie.id, kategorie.name, eintrag.id
      ORDER BY eintrag.time DESC

      Funktioniert ja auch ganz gut so, aber ich bekomme trotzdem immer noch nicht die Id des letzten Eintrages.

      1. Hi,

        Laut deiner Aussage müsste mein SQL Statement nun so aussehen:

        nö. Das neue Statement ist _sinnvoll_, ja. Ich habe aber nichts darüber gesagt, wie das Statement aussehen muss, welches Deinem Ziel entspricht. Mir ging es nur darum, dass Du GROUP BY verstehst.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
    2. yo,

      aus irgendwelchen Gründen erlaubt MySQL die völlig unsinnige Konstellation, Spalten zu selektieren, die nicht in der GROUP BY Klausel aufgelistet werden. Andere DBMSse liefern bei so etwas gnadenlos einen Fehler, weil im Grunde kein Weg existiert, einen derartigen Widerspruch aufzulösen.

      der grund dafür ist, dass die entwickler performance gewinnen wollten, da letztlich hinter jeder group by spalte sortierungen stecken. ausserdem erlaubt mysql nur spalten mit auszugeben, die nicht in der group by klausel angeführt werden, wenn der inhalt der daten in der jeweiligen gruppierung gleich ist. dann spielt es nämlich auch keine rolle mehr, welcher zufällig ausgewählt wird, sind ja eh alle gleich.

      oder mit anderen worten, mysql erlaubt solche konstrukte nicht, gibt aber keine fehlermeldung aus. scheinbar können/wollen sie nicht unterscheiden, ob nun alle spaltenwerte der jeweiligungen gruppierung gleiche werte haben oder nicht. zustimmen tue ich dir, dass das ziemlich dumm ist.

      Zusätzlich: Die Selektierung pauschal jeder Spalte einer Tabelle ist nicht praxistauglich.

      albern, das kommt immer auf den konkreten fall drauf an. programme wie phpmyadmin können diese funktion sehr gut gebrauchen, schließlich sollen sie alle spalten anzeigen, obwohl sie noch gar nicht wissen, welche genau das sein werden.

      Wenn Du gruppierst, dann nach *allen* Spalten, die Du selektierst.

      das ist meines wissens eine projektion und nicht selektion.

      Ilja

      1. Hallo Ilja,

        oder mit anderen worten, mysql erlaubt solche konstrukte nicht, gibt aber keine fehlermeldung aus. [...] zustimmen tue ich dir, dass das ziemlich dumm ist.

        schön, dass Du Deine frühere Meinung zu diesem Punkt geändert hast.

        Freundliche Grüße

        Vinzenz

        1. yo,

          schön, dass Du Deine frühere Meinung zu diesem Punkt geändert hast.

          ich fand das schon immer dumm, kann mich nicht erinnern geschrieben zu haben, dass ich es gut finde ?

          Ilja

  2. Hallo mabu

    Welche MySQL-Version verwendest Du? Das ist bei MySQL eine der wichtigsten Angaben überhaupt.

    SELECT kategorie.*, eintrag.id FROM kategorie, eintrag
    WHERE eintrag.kategorie = kategorie.id
    GROUP BY kategorie.id
    ORDER BY eintrag.time DESC

    Diese Anweisung ist syntaktisch falsch, siehe mein Archivposting und dort angegebene Links. Ich kann die MySQL-Entwickler beim besten Willen nicht verstehen, warum MySQL solche Statements akzeptiert.

    Jedoch bekomme ich hier unter "eintrag.time" immer die Zeit des ersten passenden Eintrages, nicht die des letzten.

    Besser: einen zufälligen, wie es die MySQL-Doku auch angibt :-)

    Ich bräuchte also ein GROUP BY, welches jedoch aus anderer Richtung vorgeht, wenn man das so sagen kann.

    Geht sowas, oder muss hier mit komplizierteren Strukturen gearbeitet werden? Mit JOINS etc. habe ich keine Erfahrung, deshalb diese Lösung.

    Iljas Lösung sollte Dir weiterhelfen können. Je nachdem, welche Version Du hast, kann Dir http://forum.de.selfhtml.org/archiv/2005/6/t108952/ eine Lösung bieten.

    Freundliche Grüße

    Vinzenz

    1. Danke für die Antwort, das mit den Unterabfragen war nicht blöd, so funktionierts.