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.