Ide Anda sudah dekat. Saya pikir ini akan bekerja lebih baik:
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 ;
Berikut perubahannya:
- Variabel diatur hanya dalam satu ekspresi. MySQL tidak menjamin urutan evaluasi ekspresi, jadi ini penting.
- Pekerjaan dilakukan di subkueri, yang kemudian diproses di kueri luar.
- Subquery menggunakan
order by
, bukangroup by
. - Kueri luar menggunakan
where
bukannyahaving
(sebenarnya, di MySQLhaving
akan bekerja, tetapiwhere
lebih tepat).