Jag ser ingen anledning till varför du ska behöva använda en underfråga. Jag tror att du helt enkelt kan kombinera fi_business
och fi_business_subcategory
till en enda tabellfaktor i parentes.
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
Jag har kontrollerat att detta är giltig SQL för din tabellstruktur. Jag antar att chanserna är goda att det kommer att ge önskat resultat, även om din fiol inte innehåller några data ännu. Se manualen om JOIN-syntax för detaljer om var du kan använda parenteser i en join.
Du kan också fråga dig själv om du verkligen behöver alla joins för att bli kvar joins. Att skriva saker med inre sammanfogningar skulle vara mycket lättare.
Eftersom kopplingar körs från vänster till höger kan du göra de inre kopplingarna först, följt av en sekvens med höger ansluter sig. Detta undviker parenteserna:
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