Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zamawianie w przedsprzedaży zestawienia GROUP BY

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ń.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy mogę używać hibernacji języka zapytań dla jednostek niemapowanych do tabeli?

  2. Grupuj według daty tylko w kolumnie Datetime

  3. Czy powinienem unikać COUNT wszystkich razem w InnoDB?

  4. doktryna2 - Jak poprawić efektywność spłukiwania?

  5. ON DELETE CASCADE nie działa w MySQL