La tua idea è vicina. Penso che funzionerà meglio:
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 ;
Ecco le modifiche:
- Le variabili sono impostate in una sola espressione. MySQL non garantisce l'ordine di valutazione delle espressioni, quindi questo è importante.
- Il lavoro viene eseguito in una sottoquery, che viene quindi elaborata nella query esterna.
- La sottoquery utilizza
order by
, nongroup by
. - La query esterna utilizza
where
invece dihaving
(in realtà, in MySQLhaving
funzionerebbe, mawhere
è più appropriato).