Axel Richter: order by and group by

Beitrag lesen

Hallo,

SELECT t_id, user, date FROM t WHERE b_id = 1 SORT BY t_id ASC, date DESC

t_id  user   date
1      a   2004-09-10
1      b   2004-09-09
1      c   2004-09-08
2      c   2004-09-09
2      b   2004-09-08
2      c   2004-09-04
3      d   2004-09-07
3      a   2004-09-06

Jetzt will ich im Prinzip nach t_id gruppieren

SELECT t_id, user, date FROM t WHERE b_id = 1 GROUP BY t_id SORT BY t_id ASC, date DESC

ergibt leider:

t_id  user   date
1      c   2004-09-08
2      c   2004-09-04
3      a   2004-09-06

also immer den ältesten Eintrag, egal wie ich sortiere.

Nein, _irgendeinen_ Wert der 3 möglichen Werte für user und date bei t_id=1. Das dies zufällig der erste ist, ist nicht gesichert.

Wie ich bereits schrieb kann das zweite Sortierkriterium keine Wirkung haben, weil nach der Gruppierung nach t_id jede t_id einmalig ist.

Wie Ilja schrieb, müssen, bei einer Gruppierten Abfrage, alle Felder entweder zur Gruppierung beitragen oder in einer Aggregatfunktion stehen. Aggregatfunktionen sind SUM(), MIN(), MAX()... Andere DBMS bieten die Aggregatfunktionen FIRST() und LAST() an.

SELECT t_id, FIRST(user), FIRST(date) FROM t WHERE b_id = 1 GROUP BY t_id ORDER BY t_id ASC

MySQL umgeht das, und sagt, es gibt _irgendeinen_ Wert zurück, weil es keine Aggregatfunktion FIRST() und LAST() kennt. Wobei diese auch nicht sehr sicher funktionieren können. Wie soll schließlich der erste bzw. letzte Datensatz einer Datensatzgruppe definiert sein?

SELECT t_id, MAX(date) as letztes_date FROM t WHERE b_id = 1 GROUP BY t_id ORDER BY t_id ASC

könnte fnktionieren. Ich weiß allerdings nicht, ob MySQL den Felddatentyp DATE in MAX() bzw. MIN() verwenden kann.

Für den user wirst Du allerdings mit einem Select keine Lösung finden.

viele Grüße

Axel