サブクエリを使用する必要がある理由はわかりません。 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