Twój pomysł jest bliski. Myślę, że to zadziała lepiej:
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 ;
Oto zmiany:
- Zmienne są ustawione tylko w jednym wyrażeniu. MySQL nie gwarantuje kolejności oceny wyrażeń, więc jest to ważne.
- Praca jest wykonywana w podzapytaniu, które jest następnie przetwarzane w zapytaniu zewnętrznym.
- Podzapytanie wykorzystuje
order by
, a niegroup by
. - Zewnętrzne zapytanie używa
where
zamiasthaving
(właściwie w MySQLhaving
zadziała, alewhere
jest bardziej odpowiednie).