使用 where 子句加入可能不存在的 table
Joining table which may not exist with where clause
我有两张桌子。假设他们是:
table customers: id, name
table orders: id, customer_id, is_finished(boolean), order_sum
我想进行连接以获取客户名称、he/she 已完成的订单数以及 he/she 总共花费的金额
所以我正在做这个 SQL 查询:
SELECT c.name,
coalesce(count(o.id), 0) AS orders_count,
coalesce(sum(o.order_sum ), 0) AS total_spent
FROM customers c
LEFT OUTER JOIN orders o on c.id = o.user_id
WHERE c.id = customer_id
AND o.is_finished = true
GROUP BY c.name;
如果客户有任何已完成的订单,那么它将一切正常。
|'John'|3|150|
但是如果没有订单或者有未完成的订单,则不会输出任何内容。但我想要的输出如下:
|'John'|0|0|
那么进行这样的查询的正确方法是什么,这样即使客户没有订单我也能得到结果?
我正在使用 postgreSQL 顺便说一句
只需将 LEFT JOIN
ed table 上的条件从 WHERE
子句移动到 LEFT JOIN
的 ON
子句 - 否则它将成为强制性的, 并过滤掉没有匹配订单的客户:
SELECT c.name,
count(o.id) AS orders_count,
coalesce(sum(o.order_sum ), 0) AS total_spent
FROM customers c
LEFT OUTER JOIN orders o ON c.id = o.user_id AND o.is_finished = true
WHERE c.id = customer_id
GROUP BY c.id, c.name;
我有两张桌子。假设他们是:
table customers: id, name
table orders: id, customer_id, is_finished(boolean), order_sum
我想进行连接以获取客户名称、he/she 已完成的订单数以及 he/she 总共花费的金额
所以我正在做这个 SQL 查询:
SELECT c.name,
coalesce(count(o.id), 0) AS orders_count,
coalesce(sum(o.order_sum ), 0) AS total_spent
FROM customers c
LEFT OUTER JOIN orders o on c.id = o.user_id
WHERE c.id = customer_id
AND o.is_finished = true
GROUP BY c.name;
如果客户有任何已完成的订单,那么它将一切正常。
|'John'|3|150|
但是如果没有订单或者有未完成的订单,则不会输出任何内容。但我想要的输出如下:
|'John'|0|0|
那么进行这样的查询的正确方法是什么,这样即使客户没有订单我也能得到结果?
我正在使用 postgreSQL 顺便说一句
只需将 LEFT JOIN
ed table 上的条件从 WHERE
子句移动到 LEFT JOIN
的 ON
子句 - 否则它将成为强制性的, 并过滤掉没有匹配订单的客户:
SELECT c.name,
count(o.id) AS orders_count,
coalesce(sum(o.order_sum ), 0) AS total_spent
FROM customers c
LEFT OUTER JOIN orders o ON c.id = o.user_id AND o.is_finished = true
WHERE c.id = customer_id
GROUP BY c.id, c.name;