【问题标题】:join two tables along with count of records from second table based on condition根据条件连接两个表以及第二个表中的记录数
【发布时间】: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 没错。感谢您指出这一点。

标签: mysql sql database join


【解决方案1】:

使用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 = 1WHERE 子句移动到ON 也很重要,以便查询返回categories 表的所有 记录。

【讨论】:

  • 我试过了。但是,如果某个类别没有有效的产品,则该类别的计数应返回 0。使用此查询,没有有效产品的类别会从结果中省略。
  • 你成功了。 :) 非常感谢。我不知道ON 子句中允许使用多个谓词。
猜你喜欢
  • 2022-01-19
  • 2016-11-18
  • 2021-11-11
  • 2018-05-05
  • 2015-11-01
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多