Group by: Welches Element wird zurückgegeben?

Group by: Welches Element wird zurückgegeben?

am 31.10.2006 19:47:09 von Martin Schneider

Hallo!

Ich habe ein einfache Tabelle:

CREATE TABLE mytable
(
id INT,
txt VARCHAR(16),
type CHAR(6)
) TYPE=MyISAM;
Insert into mytable set id=1, type="l", txt = "Text für id 1";
Insert into mytable set id=2, type="l", txt = "Text für id 2";
Insert into mytable set id=3, type="r", txt = "Text für id 3";
Insert into mytable set id=4, type="r", txt = "Text für id 4";

Ich möchte nun txt erhalten für jeden type, aber bei der maximalen id.
Das richtige Ergebnis wäre also:
+------+---------------+------+
| id | txt | type |
+------+---------------+------+
| 2 | Text für id 2 | l |
| 4 | Text für id 3 | r |
+------+---------------+------+

Ich bekomme aber nur dies hier hin:
mysql> select id, txt, type from mytable group by type;
+------+---------------+------+
| id | txt | type |
+------+---------------+------+
| 1 | Text für id 1 | l |
| 3 | Text für id 3 | r |
+------+---------------+------+

Das Ganze muß leider unter MySql 4.0.x laufen, also scheiden Subquerys
aus. Ideen? Oder geht es unter MySql 4.0.x nicht mit einer Abfrage?

Grüße

Martin

Re: Group by: Welches Element wird zurückgegeben?

am 31.10.2006 20:29:03 von Kris

Martin Schneider wrote:
> Ich bekomme aber nur dies hier hin:
> mysql> select id, txt, type from mytable group by type;
> +------+---------------+------+
> | id | txt | type |
> +------+---------------+------+
> | 1 | Text für id 1 | l |
> | 3 | Text für id 3 | r |
> +------+---------------+------+

Nach einem "GROUP BY type" sind alle Elemente mit demselben Type per
Definition gleich:

GROUP BY type definiert eine Äquivalenzklasse. Das ist eine Partition der
Ausgangsmenge in Teilmengen, wobei in jeder Teilmenge die Elemente mit
gleichem type-Feld enthalten sind.

In der Anzeige wählt MySQL ein beliebiges Element der Äquivalenzklasse als
Repräsentant der Klasse aus.

Wenn Dir das nicht gefällt, kannst Du durch Setzen von ONLY_FULL_GROUP_BY
(http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html ) eine
striktere Interpreation des Standards auswählen, die es Dir verbietet
Elemente im SELECT-Teil der Query auszuwählen, die nicht Aggregate sind
oder in der GROUP BY-Clause genannt werden.

Deine Query von oben ist dann ungültig.

Dein Problem und Lösungen dafür werden in
http://jan.kneschke.de/projects/mysql/groupwise-max/ ("Biggest country of
each continent -- methods for finding the groupwise maximum") diskutiert.
Darunter sind auch Lösungen die ohne Subquery auskommen.

Kris