Tôi không hiểu tại sao bạn phải sử dụng truy vấn con. Tôi tin rằng bạn có thể chỉ cần kết hợp fi_business
và fi_business_subcategory
thành một hệ số trong bảng có dấu ngoặc đơn.
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
Tôi đã đã kiểm tra rằng đây là SQL hợp lệ cho cấu trúc bảng của bạn. Tôi đoán rất có thể nó sẽ mang lại kết quả mong muốn, mặc dù fiddle của bạn chưa chứa bất kỳ dữ liệu nào. Xem hướng dẫn về cú pháp THAM GIA để biết chi tiết về nơi bạn có thể sử dụng dấu ngoặc đơn trong một phép nối.
Bạn cũng có thể tự hỏi mình liệu bạn có thực sự cần tất cả các phép nối để được phép nối trái hay không. Viết mọi thứ bằng cách sử dụng các phép nối bên trong sẽ dễ dàng hơn nhiều.
Khi các phép nối được thực thi từ trái sang phải, bạn có thể thực hiện các phép nối bên trong trước, sau đó là một chuỗi phải tham gia. Điều này tránh các dấu ngoặc đơn:
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