Din idé är nära. Jag tror att det här kommer att fungera bättre:
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 ;
Här är ändringarna:
- Variablerna ställs in i endast ett uttryck. MySQL garanterar inte ordningen för utvärdering av uttryck, så detta är viktigt.
- Arbetet görs i en underfråga, som sedan bearbetas i den yttre frågan.
- Underfrågan använder
order by
, integroup by
. - Den yttre frågan använder
where
istället för atthaving
(faktiskt, i MySQLhaving
skulle fungera, menwhere
är mer lämpligt).