-- s využitím korelovaného poddotazu pro nalezení hranice
select c2.*
from   clanky c2
join   (select k.id_kategorie,
               (select id_clanku
                from   clanky c
                where  c.id_kategorie = k.id_kategorie
                order  by id_clanku desc
                limit 4, 1) hranice
        from   kategorie k) h on c2.id_kategorie = h.id_kategorie
                                 and c2.id_clanku >= ifnull(h.hranice, c2.id_clanku)
                                 
 
 -- s využitím uživatelských proměnných
-- (pozor, při složitých dotazech se může přehodit vyhodnocování proměnných a nefunguje to ok
select c.*,
       @n := @n * (@last_idk = c.id_kategorie) + 1 n,
       @last_idk := c.id_kategorie k
from   clanky c, (select @n := 0, @last_idk := '') t
having n <= 5
order  by c.id_kategorie, c.id_clanku desc