I MySQL involverar det säkraste sättet att göra detta förmodligen variabler:
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;
Det involverar inte användning av MySQL (mis)-funktionen som tillåter kolumner i SELECT
av en aggregeringsfråga som inte är aggregerad och inte i GROUP BY
.
Här är en SQL-fiol som visar att den fungerar.
EDIT:
På ämnet ordningen för utvärdering av variabler. Från dokumentationen :
Ovanstående kod läser, tekniskt sett, variabeln i samma påstående , men det är också i samma uttryck . Semantiken för if()
(och case
som jag ibland också använder) garanterar ordningen för utvärderingen av uttrycken.