Не виждам причина защо трябва да използвате подзаявка. Вярвам, че можете просто да комбинирате fi_business
и fi_business_subcategory
към коефициент на таблица в единични скоби.
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
проверих че това е валиден SQL за структурата на вашата таблица. Предполагам, че шансовете са добри, че ще даде желания резултат, въпреки че вашата цигулка все още не съдържа никакви данни. Вижте ръководството за синтаксиса на JOIN за подробности къде можете да използвате скоби в съединение.
Може също така да се запитате дали наистина имате нужда всички съединения да бъдат оставени. Писането на неща с помощта на вътрешни съединения би било много по-лесно.
Тъй като съединенията се изпълняват отляво надясно, можете първо да направите вътрешните съединения, последвани от последователност от дясно се присъединява. Така се избягват скоби:
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