Mysql
 sql >> Database >  >> RDS >> Mysql

I primi 2 record MySQL per gruppo

La tua idea è vicina. Penso che funzionerà meglio:

select u.*
from (select user_id, created_datetime, 
             $num := if(@user_id = user_id, @num + 1,
                        if(@user_id := id, 1, 1)
                       ) as row_number
      from logs cross join
           (select @user_id := 0, @num := 0) params
      order by user_id 
     ) u
where row_number <= 2 ;

Ecco le modifiche:

  • Le variabili sono impostate in una sola espressione. MySQL non garantisce l'ordine di valutazione delle espressioni, quindi questo è importante.
  • Il lavoro viene eseguito in una sottoquery, che viene quindi elaborata nella query esterna.
  • La sottoquery utilizza order by , non group by .
  • La query esterna utilizza where invece di having (in realtà, in MySQL having funzionerebbe, ma where è più appropriato).