Din idé er tæt på. Jeg tror, det vil fungere bedre:
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 ;
Her er ændringerne:
- Variablerne er kun sat i ét udtryk. MySQL garanterer ikke rækkefølgen af evaluering af udtryk, så dette er vigtigt.
- Arbejdet udføres i en underforespørgsel, som derefter behandles i den ydre forespørgsel.
- Underforespørgslen bruger
order by
, ikkegroup by
. - Den ydre forespørgsel bruger
where
i stedet for athaving
(faktisk i MySQLhaving
ville virke, menwhere
er mere passende).