Dans MySQL, le moyen le plus sûr de le faire implique probablement des 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;
Cela n'implique pas l'utilisation de la fonctionnalité MySQL (mis) qui autorise les colonnes dans le SELECT
d'une requête d'agrégation non agrégées et non dans le GROUP BY
.
Ici est un SQL Fiddle montrant qu'il fonctionne.
MODIFIER :
Au sujet de l'ordre d'évaluation des variables. À partir de la documentation :
Le code ci-dessus lit, techniquement, la variable dans la même instruction , mais c'est aussi dans la même expression . La sémantique de if()
(et case
que j'utilise aussi parfois) garantissent l'ordre d'évaluation des expressions.