En MySQL, la forma más segura de hacer esto probablemente involucre variables:
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;
No implica el uso de la función MySQL (mis) que permite columnas en el SELECT
de una consulta de agregación que no están agregadas y no están en el GROUP BY
.
Aquí es un SQL Fiddle que lo muestra funcionando.
EDITAR:
Sobre el tema del orden de evaluación de las variables. De la documentación :
El código anterior, técnicamente, lee la variable en la misma declaración , pero también está en la misma expresión . La semántica de if()
(y case
que a veces también uso) garantizan el orden de evaluación de las expresiones.