Идеята ти е близка. Мисля, че това ще работи по-добре:
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 ;
Ето промените:
- Променливите са зададени само в един израз. MySQL не гарантира реда на оценка на изразите, така че това е важно.
- Работата се извършва в подзаявка, която след това се обработва във външната заявка.
- Подзаявката използва
order by
, а неgroup by
. - Външната заявка използва
where
вместоhaving
(всъщност в MySQLhaving
ще работи, ноwhere
е по-подходящо).