sql >> Databasteknik >  >> RDS >> Mysql

Förbeställning av en GROUP BY-sats

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.



  1. En översikt över cachelagring för PostgreSQL

  2. MIN() Funktion i PostgreSQL

  3. Kopiera/duplicera SQL-rad med blob/text, hur gör man det?

  4. Hur man ansluter Amazon RDS i iOS