sql >> Database >  >> RDS >> Mysql

Een GROUP BY-verklaring vooraf bestellen

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.



  1. Doe mee aan een telquery op generation_series() en haal null-waarden op als '0'

  2. MySQL-foutcode:1175 tijdens UPDATE in MySQL Workbench

  3. Efficiënte ISNUMERIC() vervangingen op SQL Server?

  4. Hoe kan ik de winkelcode in mysql verifiëren en de tabel bijwerken als het resultaat waar is?