आपका विचार करीब है। मुझे लगता है कि यह बेहतर काम करेगा:
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 ;
ये हैं बदलाव:
- चर केवल एक व्यंजक में सेट होते हैं। MySQL अभिव्यक्तियों के मूल्यांकन के क्रम की गारंटी नहीं देता है, इसलिए यह महत्वपूर्ण है।
- कार्य एक सबक्वेरी में किया जाता है, जिसे बाद में बाहरी क्वेरी में संसाधित किया जाता है।
- उपश्रेणी
order by
का उपयोग करती है , नहींgroup by
। - बाहरी क्वेरी
where
का उपयोग करती हैhaving
. के बजाय (वास्तव में, MySQL मेंhaving
काम करेगा, लेकिनwhere
अधिक उपयुक्त है)।