Для 2 и 3 можно так:
SELECT t1.title, t1.date, t1.author, t1.text
FROM
(SELECT articles.title, articles.date, comments.author, comments.text, articles.id as aid, comments.id as cid, DENSE_RANK() OVER ( ORDER BY articles.id DESC) as article_row, row_number () over (partition by articles.id order by comments.id) as comment_row
FROM articles INNER JOIN comments ON articles.id = comments.article ) AS t1
WHERE t1.article_row<=2 and t1.comment_row<=5
ORDER BY t1.aid DESC, t1.cid
Хотя этот вариант не оптимален по скорости, т.к. фактически сначала нумеруются статьи и комментарии к каждой статье, а затем уже отрезается лишнее.