Ý tưởng của bạn đã gần kề. Tôi nghĩ điều này sẽ hoạt động tốt hơn:
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 ;
Dưới đây là những thay đổi:
- Các biến chỉ được đặt trong một biểu thức. MySQL không đảm bảo thứ tự đánh giá các biểu thức, vì vậy điều này rất quan trọng.
- Công việc được thực hiện trong một truy vấn con, sau đó được xử lý trong truy vấn bên ngoài.
- Truy vấn con sử dụng
order by
, không phảigroup by
. - Truy vấn bên ngoài sử dụng
where
thay vìhaving
(thực ra, trong MySQLhaving
sẽ hoạt động, nhưngwhere
thích hợp hơn).