所以我的 MySQL 中有两个表:用户和购买。
用户表包含Id、Name、Surname等。购买表包含 Id、User_id、状态和支付金额。
我需要的是从这两个表中进行选择,其中我将获得每个用户购买的每件商品的总和。
我已经尝试过使用表“users”:
LEFT JOIN 'purchases'
ON 'users'.'id' = 'purchases'.'user_id'
SELECT SUM (sum) FROM 'users', 'purchases' WHERE 'purchases'.'status' = 'completed' AND 'purchases'.'user_id' = 'users'.'id'
但是这样我就得到了每个用户相同的总和,这是错误的。我应该写什么?
非常感谢任何可能的帮助!
为了提供一些实际的例子,我们来看这个:
Users:
Id: 1 Name: John
Id: 2 Name: Ann
Purchases:
Id: 10 Status: completed User_id: 1 Sum: 4.00
Id: 20 Status: completed User_id: 1 Sum: 8.00
Id: 30 Status: completed User_id: 2 Sum: 50.00
Id: 40 Status: completed User_id: 2 Sum: 100.00
运行查询后我应该得到这个:
Id: 1 Sum: 12.00
Id: 2 Sum: 150.00
查询是通过 Laravel 进行的,所以我刚刚
DB::table('users')->leftJoin... ->select(DB::raw...
最佳答案
原始答案
首先,你提交的SQL一团糟,事情完全不符合常规顺序,我不确定它是否会按所提供的那样执行。也就是说,假设我正确理解您想要的输出,这应该可以满足您的要求:
SELECT users.id, users.name, users.surname, ROUND(SUM(purchases.sum),2) AS totalSum
FROM purchases
LEFT JOIN users ON users.id = purchases.user_id
WHERE status='completed'
GROUP BY users.name, users.surname
ORDER BY users.id
您在查询中缺少的关键方面是GROUP BY
部分,为了我自己的利益,我在我的 fiddle 上添加了ORDER BY
,如果您愿意,可以使用它,或不。
这是我在发布示例数据之前为您准备的 fiddle ,我看到的其他人已经给出了主要答案,所以我只是发布它,因为我已经完成了它的工作。 http://sqlfiddle.com/#!9/8fa2d/6/0
答案2.0
Fiddle 正在运行,因此尚未测试,但请尝试一下。
SELECT users.id, users.name, users.surname, ROUND(SUM(CASE WHEN purchases.status = 'completed' THEN purchases.sum ELSE 0 END),2) AS totalSum
FROM users
LEFT JOIN purchases ON users.id = purchases.user_id
GROUP BY users.id
ORDER BY users.id
关于mysql - SQL select sum 与来自不同表的多个where,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38783346/