我有一张订单
表,以及这些订单中包含的产品表。 (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 个产品的订单之间的区别将丢失。
我在这里错过了什么?
最佳答案
你需要一个左连接在这里,你应该计算产品表中的一些列:
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
。
关于SQL如何计算两个表之间的关系数并包括零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57803167/