Mysql
 sql >> Base de données >  >> RDS >> Mysql

Les 2 meilleurs enregistrements MySQL par groupe

Votre idée est proche. Je pense que cela fonctionnera mieux :

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 ;

Voici les changements :

  • Les variables sont définies dans une seule expression. MySQL ne garantit pas l'ordre d'évaluation des expressions, c'est donc important.
  • Le travail est effectué dans une sous-requête, qui est ensuite traitée dans la requête externe.
  • La sous-requête utilise order by , pas group by .
  • La requête externe utilise where au lieu de having (en fait, dans MySQL having fonctionnerait, mais where est plus approprié).