select article_cats.id, count(articles.id) from article_cats
join articles on articles.cat_id = article_cats.id
where article_cats.published = 1 and articles.published =1
group by article_cats.id
можно еще и выдернуть данные об статьях с помощью GROUP_CONCAT
select article_cats.id, count(articles.id), group_concat(articles.id), group_concat(articles.title) from article_cats
join articles on articles.cat_id = article_cats.id
where article_cats.published = 1 and articles.published =1
group by article_cats.id
Но в этом случае нужно учитывать, что при обработке подобных данных, можно невзначай упереться в память или при не корректной обработке получить утечку памяти