sql >> Base de Datos >  >> RDS >> Mysql

MySQL top 2 registros por grupo

Tu idea está cerca. Creo que esto funcionará mejor:

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 ;

Estos son los cambios:

  • Las variables se establecen en una sola expresión. MySQL no garantiza el orden de evaluación de las expresiones, por lo que esto es importante.
  • El trabajo se realiza en una subconsulta, que luego se procesa en la consulta externa.
  • La subconsulta usa order by , no group by .
  • La consulta externa usa where en lugar de having (en realidad, en MySQL having funcionaría, pero where es más apropiado).