W MySQL najbezpieczniejszym sposobem na zrobienie tego są prawdopodobnie zmienne:
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;
Nie wymaga użycia (mis)funkcji MySQL, która zezwala na kolumny w SELECT
zapytania agregującego, które nie są agregowane i nie znajdują się w GROUP BY
.
Tu to SQL Fiddle pokazujący, jak działa.
EDYCJA:
Na temat kolejności oceny zmiennych. Z dokumentacji :
Powyższy kod, technicznie rzecz biorąc, odczytuje zmienną w tym samym instrukcji , ale jest też w tym samym wyrażeniu . Semantyka if()
(i case
których czasem też używam) gwarantują kolejność oceny wyrażeń.