sql >> Base de Datos >  >> RDS >> Mysql

Pedido anticipado de una instrucción GROUP BY

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.