Tek sorguda nasıl olur tam bilmiyorum ama mantık olarak önce tüm kategorileri çekip sonra diğer tabloda o kategoride bilgi varsa onları getirmek gerekiyor. Şöyle yazayım siz buna uygun deneyin.
<?php
$categories = $db->query("SELECT * FROM kategoriler")->fetchAll(PDO::FETCH_ASSOC);
if($categories) {
 foreach($categories as $category) {
  $posts = $db->prepare("SELECT * FROM posts WHERE category_id=?");
  $posts->execute(array($category["id"]));
  $result = $posts->fetchAll(PDO::FETCH_ASSOC);
   foreach($result as $post) {
     // döngüye girecek tasarımı buraya yazabilirsiniz.
   }
}
}
?>
 
  
