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
, pasgroup by
. - La requête externe utilise
where
au lieu dehaving
(en fait, dans MySQLhaving
fonctionnerait, maiswhere
est plus approprié).