Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Vorbestellen einer GROUP BY-Anweisung

In MySQL geht das wahrscheinlich am sichersten mit Variablen:

select im.*
from (select im.*,
             (@rn := if(@p = platform_type_id, @rn + 1,
                        if(@p := platform_type_id, 1, 1)
                       )
             ) as rn
      from main_itemmaster im cross join
           (select @rn := 0, @p := '') params
      order by platform_type_id, (territory_id = 'US') desc
     ) im
where rn = 1;

Das beinhaltet nicht die Verwendung der MySQL (Miss-)Funktion, die Spalten im SELECT zulässt einer Aggregationsabfrage, die nicht aggregiert sind und nicht im GROUP BY enthalten sind .

Hier ist eine SQL-Fiddle, die zeigt, dass sie funktioniert.

BEARBEITEN:

Zum Thema der Reihenfolge der Auswertung von Variablen. Aus der Dokumentation :

Technisch gesehen liest der obige Code die Variable in derselben Anweisung , aber es befindet sich auch im selben Ausdruck . Die Semantik von if() (und case die ich manchmal auch benutze) garantieren die Reihenfolge der Auswertung der Ausdrücke.