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ãogroup by
. - A consulta externa usa
where
em vez dehaving
(na verdade, no MySQLhaving
funcionaria, maswhere
é mais apropriado).