Mysql
 sql >> Database >  >> RDS >> Mysql

Preordinare un'istruzione GROUP BY

In MySQL, il modo più sicuro per farlo coinvolge probabilmente le variabili:

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;

Non implica l'uso della (mis)funzione MySQL che consente colonne in SELECT di una query di aggregazione che non sono aggregate e non nel GROUP BY .

Qui è un SQL Fiddle che mostra che funziona.

MODIFICA:

Sul tema dell'ordine di valutazione delle variabili. Dalla documentazione :

Il codice sopra, tecnicamente, legge la variabile nella stessa istruzione , ma è anche nella stessa espressione . La semantica di if() (e case che a volte uso anche io) garantiscono l'ordine di valutazione delle espressioni.