zwelch: MySQL GROUP BY "größter Wert"

mysql 5.1

select  
    p.last_name,  
    p.first_name,  
    s.name  
from  
    player p  
    join team t on (t.player = p.id)  
    join reference_season r on (r.id = t.reference_season)  
    join season s on (s.id = r.id_season)  
order by  
    s.name desc

Bei der Abfrage komm so etwas was raus:

  
nachname_1 | vorname_1 | 2010/2011  
nachname_2 | vorname_2 | 2010/2011  
nachname_3 | vorname_3 | 2010/2011  
nachname_4 | vorname_4 | 2010/2011  
  
nachname_1 | vorname_1 | 2009/2010  
nachname_2 | vorname_2 | 2009/2010  
  
nachname_1 | vorname_1 | 2008/2009  
nachname_2 | vorname_2 | 2008/2009  
nachname_3 | vorname_3 | 2008/2009  
  
nachname_1 | vorname_1 | 2007/2008  
nachname_1 | vorname_2 | 2007/2008

Das ist im Prinzip auch was ich will ... fast. Sinn der Abfrage ist es, alle Spieler einer Mannschaft auszulesen mit der Jahreszahl (letzte Spalte) in der sie das letzte mal im Verein gespielt haben. Allerdings soll immer nur der Datensatz mit der letzten Jahreszahl ausgegeben werden. Beispiel: hat ein Spieler in der Saison 2007/2008, 2008/2009 und 2009/2010 gespielt, soll auch nur der Datensatz "Dampf", "Hans", "2009/2010" ausgegeben werden ... die anderen beiden sollen "unter den Tisch fallen".

Wenn ich nun einfach ein GROUP BY an die Abfrage anhänge hab ich im Prinzip das was ich will, nur scheint der Wert der letzten Spalte willkürlich zu sein, es muss aber der größte Wert sein (also 2009/2010, nicht 2008/2009). Wie kann ich das realisieren?

Jack

  1. Mahlzeit zwelch,

    Wenn ich nun einfach ein GROUP BY an die Abfrage anhänge hab ich im Prinzip das was ich will,

    Im Prinzip, genau - und zwar weil MySQL im Gegensatz zu pingeligeren (und IMHO daher *vernünftigeren*) DBMS Dich auf diesen Fehler nicht hinweist, sondern ...

    nur scheint der Wert der letzten Spalte willkürlich zu sein,

    ... Dir einfach *irgendeinen* Wert ausgibt. Sag doch der Datenbank einfach, welchen der Werte Du haben willst.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  2. moin,

    Wenn ich nun einfach ein GROUP BY an die Abfrage anhänge hab ich im Prinzip das was ich will, nur scheint der Wert der letzten Spalte willkürlich zu sein, es muss aber der größte Wert sein (also 2009/2010, nicht 2008/2009). Wie kann ich das realisieren?

    group by ist der falsche ansatz, nimm nur die tabelle der spieler(player) in der fraum klausel und mache den rest über korrelierte unterabfrage.

    Ilja