5.7. Wie bekommt man die Zeile mit dem Maximalwert pro Gruppe?

Wenn bereits eine MySQL Version >= 4.1 verwendet wird, dann ist es simpel mit einem Subquery lösbar.

Gegeben ist folgendes:

select * from test order by prdnr, preis;

+-------+-------+-------+
| prdnr | bez   | preis |
+-------+-------+-------+
|     1 | Bla   |  5.99 |
|     1 | Bla   |  6.19 |
|     1 | Bla   |  6.49 |
|     2 | Blubb | 12.29 |
|     2 | Blubb | 12.45 |
|     2 | Blubb | 12.99 |
|     3 | Laber | 10.99 |
+-------+-------+-------+

Jetzt möchte man nur die Datensätze mit dem maximalen Preis pro prdnr und bez.

In MySQL >= 4.1 funktioniert folgendes:

select test.prdnr, test.bez, test.preis
from test
where test.preis = (select max(t2.preis)
                    from test t2
                    where t2.prdnr = test.prdnr
                      and t2.bez = test.bez)
order by bez;

In MySQL Versionen vor 4.1 kann man das mit einem self-join lösen:

select test.prdnr, test.bez, test.preis
from test
left join test t2 on (t2.prdnr = test.prdnr
                  and t2.bez = test.bez
                  and t2.preis > test.preis)
where t2.preis is null
order by bez;

Wenn man allerdings mehr als 1 Datensatz mit identischem maximalem Preis (um beim Beispiel zu bleiben) mit gleicher prdnr hat, dann hat man wieder ein Problem. Dazu ist mir leider noch keine brauchbare Lösung eingefallen.