Bạn phải sử dụng các biến, thực hiện hai lần đếm khác nhau trên một truy vấn có thứ tự:một trên số lượng bài đăng cho mỗi người dùng và một cho người dùng:
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
CHỈNH SỬA: Bạn cũng có thể cân nhắc thử truy vấn này:
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
(điều này sẽ chỉ chọn 5 bài đăng, trong số tất cả các bài đăng từ mỗi người dùng đã chọn, vì vậy nó vẫn không phải là những gì bạn cần, nhưng nó sử dụng một thủ thuật để sử dụng LIMIT trong một truy vấn phụ)
EDIT2: Truy vấn tiếp theo sẽ giới hạn 5 bài đăng cho mỗi người trong số 20 người dùng:
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