Não vejo razão para você ter que usar uma subconsulta. Acredito que você pode simplesmente combinar
fi_business
e fi_business_subcategory
para um único fator de tabela entre parênteses. SELECT
c.id,
c.name,
c.slug,
sc.id,
sc.name,
sc.slug,
COUNT(bsc.id) AS business_count
FROM
fi_category c
LEFT JOIN
fi_subcategory sc ON c.id = sc.category_id AND (sc.deleted_at IS NULL)
LEFT JOIN (
fi_business b
INNER JOIN
fi_business_subcategory bsc ON b.id = bsc.business_id AND (bsc.deleted_at IS NULL)
INNER JOIN
fi_suburb su ON su.id = b.suburb_id AND su.city_id = 1
) ON sc.id = bsc.subcategory_id
WHERE
(c.deleted_at IS NULL)
GROUP BY
c.id, sc.id
Eu verifiquei que este é um SQL válido para sua estrutura de tabela. Eu acho que as chances são boas de que ele produza o resultado desejado, mesmo que seu violino ainda não contenha nenhum dado. Consulte o manual sobre a sintaxe JOIN para obter detalhes sobre onde você pode usar parênteses em uma junção.
Você também pode se perguntar se realmente precisa que todas as junções sejam junções à esquerda. Escrever coisas usando associações internas seria muito mais fácil.
Como as junções são executadas da esquerda para a direita, você pode fazer as junções internas primeiro, seguidas por uma sequência de direita junta. Isso evita os parênteses:
SELECT
c.id cat_id,
c.name cat_name,
c.slug cat_slug,
sc.id sub_id,
sc.name sub_name,
sc.slug sub_slug,
COUNT(bsc.id) AS business_count
FROM
fi_business b
INNER JOIN
fi_business_subcategory bsc ON b.id = bsc.business_id
AND (b.deleted_at IS NULL) AND (bsc.deleted_at IS NULL)
INNER JOIN
fi_suburb su ON su.id = b.suburb_id AND su.city_id = 1
RIGHT JOIN
fi_subcategory sc ON sc.id = bsc.subcategory_id
RIGHT JOIN
fi_category c ON c.id = sc.category_id AND (sc.deleted_at IS NULL)
WHERE
(c.deleted_at IS NULL)
GROUP BY
c.id, sc.id