In MySQL zijn variabelen de veiligste manier om dit te doen:
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;
Het omvat niet het gebruik van de MySQL (mis)functie die kolommen toestaat in de SELECT
van een aggregatiequery die niet zijn geaggregeerd en niet in de GROUP BY
.
Hier is een SQL Fiddle die laat zien dat het werkt.
BEWERKEN:
Over de volgorde van de evaluatie van variabelen. Uit de documentatie :
De bovenstaande code leest technisch gezien de variabele in dezelfde instructie , maar het is ook in dezelfde uitdrukking . De semantiek van if()
(en case
die ik soms ook gebruik) garanderen de volgorde van evaluatie van de uitdrukkingen.