आपको एक आदेशित क्वेरी पर दो अलग-अलग गणना करते हुए चर का उपयोग करना होगा:प्रत्येक उपयोगकर्ता के लिए पदों की संख्या पर एक और उपयोगकर्ताओं के लिए एक:
SELECT posts_counts.*
FROM (
SELECT
posts.*,
@post_count:=case when @prec_user_id=user_id then @post_count+1 else 1 end as pc,
case when @prec_user_id<>user_id then @user_count:[email protected]_count+1 else @user_count end as uc,
@prec_user_id:=user_id
FROM
posts,
(select @prec_user_id:=0, @user_count:=0, @post_count:=0) counts
ORDER BY
posts.user_id ) posts_counts
WHERE pc<5 and uc<4
संपादित करें: आप इस प्रश्न को आजमाने पर भी विचार कर सकते हैं:
SELECT *
FROM `posts`
WHERE
`user_id` IN ( SELECT user_id FROM (
SELECT DISTINCT `user_id`
FROM `posts`
ORDER BY `user_id` DESC
LIMIT 4 ) limit_users
)
LIMIT 5
(यह प्रत्येक चयनित उपयोगकर्ता की सभी पोस्टों में से केवल 5 पदों का चयन करेगा, इसलिए यह अभी भी वह नहीं है जिसकी आपको आवश्यकता है, लेकिन यह सब-सबक्वेरी में LIMIT का उपयोग करने के लिए एक ट्रिक का उपयोग करता है)
संपादित करें2: अगली क्वेरी 20 उपयोगकर्ताओं में से प्रत्येक के लिए 5 पोस्ट सीमित कर देगी:
select posts_limited.*
from (
select
posts.*,
@row:=if(@last_user=posts.user_id, @row+1, 1) as row,
@last_user:=posts.user_id
from
posts inner join
(select user_id from
(select distinct user_id
from posts
order by user_id desc
LIMIT 20) limit_users
) limit_users
on posts.user_id = limit_users.user_id,
(select @last_user:=0, @row:=0) r
) posts_limited
where row<=5