Gim*_*ali 5 mysql sql database join
我有以下表格 -
类别
+-----------+-------------+
| column | type |
+-----------+-------------+
| id | int(11) |
| name | varchar(40) |
| unit | varchar(50) |
| is_active | tinyint(1) |
+-----------+-------------+
Run Code Online (Sandbox Code Playgroud)
和
制品
+-------------+---------------+
| column | type |
+-------------+---------------+
| id | int(11) |
| category_id | int(11) |
| name | varchar(40) |
| base_rate | decimal(10,2) |
| is_active | tinyint(1) |
+-------------+---------------+
Run Code Online (Sandbox Code Playgroud)
我想获得类别列表以及活跃的产品数量.如果某个类别的产品没有活动,则应返回0.
有点像下表 -
+----+--------+--------------+
| id | name | active_count |
+----+--------+--------------+
| 1 | Steel | 1 |
| 2 | Cement | 2 |
+----+--------+--------------+
Run Code Online (Sandbox Code Playgroud)
我想出了以下查询 -
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;
Run Code Online (Sandbox Code Playgroud)
只有当每个类别中至少有一个产品处于活动状态时,上述查询才有效.如果没有产品面世,它应该返回active_count为0
我怎样才能解决这个问题 ?
使用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;
Run Code Online (Sandbox Code Playgroud)
将谓词p.is_active = 1从WHERE子句移动到也很重要ON,以便查询返回表的所有记录categories.