No MySQL, a maneira mais segura de fazer isso provavelmente envolve variáveis:
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;
O não envolve o uso do recurso MySQL (mis) que permite colunas no
SELECT
de uma consulta de agregação que não está agregada e não está no GROUP BY
. Aqui é um SQL Fiddle mostrando-o funcionando.
EDITAR:
A propósito da ordem de avaliação das variáveis. Da documentação :
O código acima, tecnicamente, lê a variável na mesma instrução , mas também está na mesma expressão . A semântica de
if()
(e case
que às vezes também uso) garantem a ordem de avaliação das expressões.