У меня есть следующие таблицы -соединить две таблицы вместе с подсчетом записей из второй таблицы на основе условия
Вот SQLFIDDLE
Категория
+-----------+-------------+
| column | type |
+-----------+-------------+
| id | int(11) |
| name | varchar(40) |
| unit | varchar(50) |
| is_active | tinyint(1) |
+-----------+-------------+
и
продукты
+-------------+---------------+
| column | type |
+-------------+---------------+
| id | int(11) |
| category_id | int(11) |
| name | varchar(40) |
| base_rate | decimal(10,2) |
| is_active | tinyint(1) |
+-------------+---------------+
Я хочу получить список категорий вместе с количеством активных элементов. Если никакие продукты не активны для категории она должна возвращать 0.
Несколько как таблицу ниже -
+----+--------+--------------+
| id | name | active_count |
+----+--------+--------------+
| 1 | Steel | 1 |
| 2 | Cement | 2 |
+----+--------+--------------+
Я придумал следующий запрос -
SELECT c.id, c.name, c.unit, COUNT(p.category_id) as active_count
FROM `categories` c
JOIN `products` p
ON c.id = p.category_id
WHERE (p.is_active = 1)
GROUP BY p.category_id;
Это выше запрос работает только когда есть по крайней мере один продукт, активный в каждой категории. Если нет доступных продуктов, он должен вернуть active_count
как
Как это исправить?
Вот SQLFIDDLE
Ваша GROUP BY является «наизнанку» ... Do 'GROUP BY c.id, c.name, c.uni'. То есть выбранные вами столбцы, которые не являются аргументами для любых агрегатных функций, являются теми, которые должны быть перечислены в разделе group by. – jarlh
@jarlh Это верно. Спасибо, что указали. – Gimali