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
, nogroup by
. - La consulta externa usa
where
en lugar dehaving
(en realidad, en MySQLhaving
funcionaría, perowhere
es más apropiado).