我有两个表:customers
和orders
。
id
和email
在customers
中都是唯一的,而uid
和price
在orders
中可能有重复。
我想从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
?
以下是显示所需输出的示例:
答案 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
不同,这意味着不确定的价值。