Ваш вопрос несколько неясен. Как вы можете считать проблемы, если вы выбираете конкретную? Если вы хотите подсчитать категории, связанные с конкретной проблемой, вы делаете это (я предполагаю, что у вас есть внешние ключи и нет дубликатов в таблице problem_categories):
SELECT problem_id, COUNT(category_id) as num_categories
FROM problem_categories
WHERE problem_id = 266
GROUP BY problem_id
, затем присоединитесь к таблице проблем, если вам нужно распечатать больше информации о проблемах (для эффективности всегда подробно указывайте последние). Если вы хотите посчитать проблему -> категория -> проблема, то выполните:
select p1.problem_id, (COUNT(DISTINCT(p2.problem_id)) - 1) as num_problems
FROM
(select problem_id, category_id FROM problem_categories where problem_id = 266) as p1
inner join
(select problem_id, category_id FROM problem_categories) as p2
ON p1.category_id = p2.category_id
GROUP by p1.problem_id
Опять же, если вы хотите показать подробности проблемы, присоединитесь к таблице проблем, чтобы получить их. Если вы хотите, чтобы num_problems и num_categories вместе соединяли первый запрос со вторым, прежде чем соединяться с таблицей проблем, чтобы получить подробности проблемы. i.e.:
SELECT p1.problem_id, p1.num_categories, p2.num_problems
FROM
(SELECT problem_id, COUNT(category_id) as num_categories
FROM problem_categories
WHERE problem_id = 266
GROUP BY problem_id) as p1
INNER JOIN
(SELECT p1.problem_id, (COUNT(DISTINCT(p2.problem_id)) - 1) as num_problems
FROM
(SELECT problem_id, category_id FROM problem_categories where problem_id = 266) as p1
INNER JOIN
(SELECT problem_id, category_id FROM problem_categories) as p2
ON p1.category_id = p2.category_id
GROUP by p1.problem_id) as p2
ON p1.problem_id = p2.problem_id