Интересный вариант для N-Greatest-Per-Group
SELECT id, name, limit, postid, title, body, date, author
FROM
(
SELECT
c.id, c.name, c.limit, p.id postid, p.title, p.body, p.date, p.author
@r:=case when @g=C.id then @r+1 else 1 end r,
@g:=C.id
FROM
(select @g:=null,@r:=0) n
CROSS JOIN CATEGORY C
INNER JOIN POSTS p on p.category = c.id
ORDER BY
C.ID, postid
) X
WHERE r<=c.limit
ORDER BY ID, postid
Сторона, влияющая на переменные, по существу, производит 2 столбца
- @ G = группа
- @ R = номер строки в группе
Это может быть дорого, потому что нет ярлыка, он нумерует КАЖДУЮ строку в категории / сообщении JOIN, и только после этого он сокращается в WHERE r<=c.limit
бите.