如何使用SUM并返回所有行,即使没有任何总和?

时间:2014-01-26 19:11:46

标签: php mysql sql

我有一张表USERS和一张表ORDERS。在我的后端办公室,我正在尝试输出一个包含所有用户(客户)和SUM个人订单总数的表格,所以为了简化我的说法:

SELECT users.id, SUM(orders.total) as spent FROM users
    JOIN orders ON users.id=orders.customer_id GROUP BY users.id

(注意:不要注意语法,这只是为了说明一点。运行时语法很好。

我现在总共说了4个用户ORDERS表看起来像这样:

order_id  customer_id  total
1         1            25
2         2            10
3         1            5   

然后我的查询将仅输出ORDERS表中可以找到的那些用户,我的后端客户概览表看起来很遗憾:

Customer ID      Spent in Total
1                30
2                10

完全忽略尚未下订单的其他2位用户。我想看到的是:

Customer ID      Spent in Total
1                30
2                10
3                0
4                0

有办法做到这一点吗?

我的猜测是它与内部,外部等特殊连接有关,但我不知道它们之间的区别。

我还想到的是运行两个查询,从用户中选择*,然后运行foreach来总结订单总数,但这似乎效率低下。

3 个答案:

答案 0 :(得分:4)

因为有时候一张图片的价值超过千字:

SQL Joins

答案 1 :(得分:1)

你需要一个左连接,并且在一些(旧)版本的MySQL上也需要一个IFNULL()

SELECT 
  users.id, 
  IFNULL(SUM(orders.total),0) as spent 
FROM users
LEFT JOIN orders ON users.id=orders.customer_id 
GROUP BY users.id

答案 2 :(得分:0)

select u.id, sum(o.Total)
from Users u
left outer join Orders o on u.id = o.customer_id
group by u.id