Tvůj nápad je blízko. Myslím, že to bude fungovat lépe:
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 ;
Zde jsou změny:
- Proměnné jsou nastaveny pouze v jednom výrazu. MySQL nezaručuje pořadí vyhodnocování výrazů, takže je to důležité.
- Práce se provádí v dílčím dotazu, který je následně zpracován ve vnějším dotazu.
- Poddotaz používá
order by
, nikoligroup by
. - Vnější dotaz používá
where
místohaving
(ve skutečnosti v MySQLhaving
by fungovalo, alewhere
je vhodnější).