Без просмотра ваших данных довольно сложно сказать, но я бы порекомендовал изменить Внутренние СОЕДИНЕНИЯ на ЛЕВЫЕ соединения
например.
SELECT category_name, categories.category_id, problems.problem_id, COUNT(problems.problem_id) as num_problems
FROM categories
LEFT JOIN problem_categories
ON problem_categories.category_id = categories.category_id
LEFT JOIN problems
ON problems.problem_id = problem_categories.category_id
WHERE is_top = 1
GROUP BY category_name, categories.category_id, problems.problem_id;
Поскольку у вас есть проблема с определенным идентификатором проблемы, я обычно пишу инструкцию SQL, чтобы помочь отладить ее, выполнив что-то вроде
SELECT is_top , category_name, categories.category_id, problems.problem_id
FROM
problems
LEFT JOIN problem_categories
ON problems.problem_id = problem_categories.category_id
LEFT JOIN categories
ON problem_categories.category_id = categories.category_id
WHERE problems.problem_id = 1234 --Whatever the ID is that you think should be showing up
Это поможет определить, является ли is_top действительно верным, а также определить и любые предположения, которые я сделал в отношении JOINS (например, нулевые значения в объединенных полях)