Uw idee is dichtbij. Ik denk dat dit beter zal werken:
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 ;
Dit zijn de wijzigingen:
- De variabelen worden in slechts één expressie gezet. MySQL garandeert niet de volgorde van evaluatie van uitdrukkingen, dus dit is belangrijk.
- Het werk wordt gedaan in een subquery, die vervolgens wordt verwerkt in de buitenste query.
- De subquery gebruikt
order by
, nietgroup by
. - De buitenste query gebruikt
where
in plaats vanhaving
(eigenlijk, in MySQLhaving
zou werken, maarwhere
is meer geschikt).