Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Os 2 principais registros do MySQL por grupo


Sua ideia está próxima. Acho que isso vai funcionar melhor:
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 ;

Aqui estão as mudanças:
  • As variáveis ​​são definidas em apenas uma expressão. O MySQL não garante a ordem de avaliação das expressões, então isso é importante.
  • O trabalho é feito em uma subconsulta, que é processada na consulta externa.
  • A subconsulta usa order by , não group by .
  • A consulta externa usa where em vez de having (na verdade, no MySQL having funcionaria, mas where é mais apropriado).