Di MySQL, cara teraman untuk melakukan ini mungkin melibatkan variabel:
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;
Itu tidak melibatkan penggunaan fitur MySQL (salah) yang mengizinkan kolom di SELECT
dari kueri agregasi yang tidak diagregasi dan tidak dalam GROUP BY
.
Di sini adalah SQL Fiddle yang menunjukkannya berfungsi.
EDIT:
Pada subjek urutan evaluasi variabel. Dari dokumentasi :
Kode di atas, secara teknis, membaca variabel dalam pernyataan yang sama , tetapi juga dalam ekspresi . yang sama . Semantik if()
(dan case
yang terkadang juga saya gunakan) menjamin urutan evaluasi ekspresi.