SQL如何计算两个表之间的关系数并包含零?

SQL如何计算两个表之间的关系数并包含零?,sql,postgresql,group-by,relationship,Sql,Postgresql,Group By,Relationship,我有一个订单表,以及这些订单中包含的产品表。(产品-表中有订单id,一个外键引用订单.id) 我想查询每个订单中包含的产品数量。但是,如果订单根本不包含任何产品,我也希望订单包含在结果中 这意味着一个简单的 SELECT *, COUNT(*) n_products FROM `orders` INNER JOIN `products` on `products.order_id` = `orders.id` GROUP_BY `order_id` 不起作用,因为没有任何产品的订单会消失 相

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

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

这意味着一个简单的

SELECT *, COUNT(*) n_products FROM `orders` INNER JOIN `products` on `products.order_id` = `orders.id` GROUP_BY `order_id` 
不起作用,因为没有任何产品的订单会消失

相反,使用
左外部联接将添加没有产品信息的行,但是具有1个产品的订单和具有0个产品的订单之间的区别将丢失


我在这里遗漏了什么?

这里需要一个左连接,并且应该从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

此处需要左连接,您应该从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

为什么产品知道其订单,而不知道其产品的订单?产品应该独立于订单…@S-Man这是实际应用程序的简化视图,其中关系通过一个中间多对多表。为什么产品知道他们的订单,而不知道他们产品的订单?产品应该独立于订单…@S-Man这是实际应用程序的简化视图,其中关系通过一个中间多对多表。啊哈!因此,如果我们在
订单
表中有一行没有相关的
产品
?@Qqwy是,那么从products表中计算一列,而不是执行
计数(*)
,将导致返回
0
,因为没有产品的订单在所有产品列中都只是一条
NULL
的记录,而
COUNT
忽略
NULL
并将它们计为零。啊哈!因此,如果我们在
订单
表中有一行没有相关的
产品
?@Qqwy是,那么从products表中计算一列,而不是执行
计数(*)
,将导致返回
0
,因为没有产品的订单在所有产品列中都只是一条
NULL
的记录,而
COUNT
忽略
NULL
并将它们计为零。