SQL从一个表中选择所有字段以及与给定条件匹配的另一个表中的所有值的总和

时间:2017-10-22 20:31:50

标签: mysql sql

我有两个表:customersorders

idemailcustomers中都是唯一的,而uidpriceorders中可能有重复。

我想从customers中选择所有字段,其中email ='john@doe.com',以及该用户从orders支付的总价。如果john doe还没有订购任何东西(即orders中有uid匹配用户id的0记录),我仍然需要返回此用户的字段列表,但是支付的价格总和必须为零。

以下是我的尝试:

SELECT t1.id, t1.email, 
       t2.uid, (SELECT SUM(t2.price)) AS total_price
FROM customers t1, orders t2
WHERE t1.email = '$email' AND t2.uid = t1.id

问题是此查询仅在orders中至少有一条记录时有效,因为t2.uid = t1.id条款的检查位于where子句中。

如果orders中没有与客户ID具有相同uid的记录,则查询将返回NULL,这不是我想要的。

即使customers中没有记录,我如何始终返回orders中的所有字段以及orders中支付的所有价格的总和customers.id

以下是显示所需输出的示例:

enter image description here

1 个答案:

答案 0 :(得分:1)

我简单的方法是一个相关的子查询:

SELECT c.*,
       (SELECT COALESCE(SUM(o.price), 0)
        FROM orders o
        WHERE o.u_id = c.id
       ) AS total_price
FROM customers c
WHERE c.email = '$email';

撰写更好的查询的提示:

  • 学习使用参数而不是使用参数值来设置查询字符串。您的WHERE应该更像WHERE c.email = ?
  • 您的表别名应该是表名的缩写。
  • 从不FROM子句中使用逗号。 始终使用正确的JOIN语法。
  • 当您的数据没有客户订单时,它会返回一个没有行的空集。这与NULL不同,这意味着不确定的价值。