2016-04-01 1 views
3

У меня есть следующие таблицы -соединить две таблицы вместе с подсчетом записей из второй таблицы на основе условия

Вот 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

+1

Ваша GROUP BY является «наизнанку» ... Do 'GROUP BY c.id, c.name, c.uni'. То есть выбранные вами столбцы, которые не являются аргументами для любых агрегатных функций, являются теми, которые должны быть перечислены в разделе group by. – jarlh

+0

@jarlh Это верно. Спасибо, что указали. – Gimali

ответ

4

Использование LEFT JOIN вместо INNER JOIN:

SELECT c.id, c.name, c.unit, COUNT(p.category_id) as active_count 
FROM `categories` c 
LEFT JOIN `products` p 
    ON c.id = p.category_id AND p.is_active = 1 
GROUP BY c.id; 

Важно также, чтобы переместить предикат p.is_active = 1 из WHERE пункта к ON, так что все записи categories таблицы возвращаются запрос.

+0

Я пробовал. Но если для категории нет активных продуктов, она должна возвращать значение 0 для такой категории. С помощью этого запроса категория, не имеющая активных продуктов, опускается из результатов. – Gimali

+0

Ты прибил его. :) Большое спасибо. Я не знал, что в предложении 'ON' допускаются множественные предикаты. – Gimali

Смежные вопросы