【问题标题】:SQL how to count the number of relations between two tables and include zeroes?SQL如何计算两个表之间的关系数并包含零?
【发布时间】:2019-09-05 10:10:42
【问题描述】:

我有一张orders 的表格,以及这些订单中包含的产品表格。 (products-表有order_id,一个外键引用orders.id)。

我想查询每个订单中包含的产品数量。但是,如果订单根本不包含 任何 产品,我也希望订单包含在结果中。

这意味着一个简单的

SELECT *, COUNT(*) n_products FROM `orders` INNER JOIN `products` on `products.order_id` = `orders.id` GROUP_BY `order_id` 

不起作用,因为没有任何产品的订单会消失。

使用 LEFT OUTER JOIN 代替会添加没有产品信息的行,但是会丢失包含 1 个产品的订单和包含 0 个产品的订单之间的区别。

我在这里错过了什么?

【问题讨论】:

  • 为什么产品知道自己的订单,却不知道订单自己的产品?产品应该独立于订单...
  • @S-Man 这是实际实际应用程序的简化视图,其中关系通过中间多对多表。

标签: sql postgresql group-by relationship


【解决方案1】:

你需要一个左连接,你应该从 products 表中计算一些列:

SELECT
    o.*,
    COUNT(p.order_id) AS n_products
FROM orders o
LEFT JOIN products p
    ON p.order_id = o.id
GROUP BY
    o.id;

请注意,我假设 Postgres 允许按 orders.id 分组,然后从该表中选择所有列。如果没有,那么除了计数之外,您只能选择o.id

【讨论】:

  • 啊哈!因此,如果 orders 表中有一行没有相关的 products,则从 products 表中计算一列而不是 count(*) 会导致返回 0
  • @Qqwy 是的,因为没有产品的订单只会是一条记录,所有产品列中都有NULL,而COUNT 忽略NULL 并将它们计为零。
猜你喜欢
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 2017-09-23
  • 2013-09-01
  • 1970-01-01
相关资源
最近更新 更多