Ihre Idee liegt nahe. Ich denke, das wird besser funktionieren:
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 ;
Hier sind die Änderungen:
- Die Variablen werden in nur einem Ausdruck gesetzt. MySQL garantiert nicht die Reihenfolge der Auswertung von Ausdrücken, daher ist dies wichtig.
- Die Arbeit wird in einer Unterabfrage erledigt, die dann in der äußeren Abfrage verarbeitet wird.
- Die Unterabfrage verwendet
order by
, nichtgroup by
. - Die äußere Abfrage verwendet
where
statthaving
(eigentlich in MySQLhaving
würde funktionieren, aberwhere
ist besser geeignet).