あなたの考えは近いです。これでうまくいくと思います:
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 ;
変更点は次のとおりです。
- 変数は1つの式でのみ設定されます。 MySQLは式の評価の順序を保証しないため、これは重要です。
- 作業はサブクエリで実行され、サブクエリは外部クエリで処理されます。
- サブクエリは
order by
を使用します 、group by
ではありません 。 - 外部クエリは
where
を使用しますhaving
の代わりに (実際には、MySQLではhaving
動作しますが、where
より適切です。