【发布时间】:2016-07-21 06:59:18
【问题描述】:
我有以下表格 -
这里是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 作为 0
我该如何解决这个问题?
这里是SQLFIDDLE
【问题讨论】:
-
您的 GROUP BY 是“由内而外”... 执行
GROUP BY c.id, c.name, c.uni。 IE。您选择的不是任何聚合函数的参数的列是应该列在 group by 子句中的列。 -
@jarlh 没错。感谢您指出这一点。