Удалите WHERE p.active=1
, что приведет к сбою для любых категорий, у которых нет продуктов (в результате чего запрос не будет возвращать строки для этих категорий) и переместите это условие в предложение ON
для этого LEFT JOIN
. Таким образом, вы все равно получите строку NULL
для этих категорий, что позволит им показывать как имеющие 0 продуктов.
SELECT c.id_category, COUNT(p.id_product) AS nproducts
FROM ps_category AS c
LEFT JOIN ps_category_product AS cp ON cp.id_category=c.id_category
LEFT JOIN ps_product AS p ON p.id_product=cp.id_product AND p.active=1
GROUP BY c.id_category
ORDER BY nproducts ASC
Обратите внимание, что для подсчета только активных продуктов необходимо учитывать p.id_product
, а не cp.id_product
.