让我们说,有两个表:
select * from users;
+-------+------+
| login | type |
+-------+------+
| test1 | A |
| test2 | A |
| test3 | B |
+-------+------+
和
select * from money;
+-------+--------+------------+
| login | amount | date |
+-------+--------+------------+
| test1 | 10.00 | 1325379661 |
| test1 | 20.00 | 1357002061 |
| test2 | 33.30 | 1388538061 |
+-------+--------+------------+
我需要从users表中选择login& type字段,并从所选日期范围内的第二个表中选择amount字段的SUM。如果所选期间的金额为空,或者在“金钱”中没有任何登录记录。 table,然后返回零值(不是空集)。
我采取以下方式:
SELECT u.login,u.type, SUM(m.amount) as amount
FROM users AS u
LEFT JOIN money AS m ON m.login=u.login
WHERE date>1388710861 GROUP BY u.login;
此查询合理地返回空集,但我需要获取用户列表和零金额:
+-------+------+--------+
| login | type | amount |
+-------+------+--------+
| test1 | A | 0.00 |
| test2 | A | 0.00 |
| test3 | B | 0.00 |
+-------+------+--------+
这怎么可能?
答案 0 :(得分:2)
它为空,因为您的where条件(日期> 1388710861)过滤所有数据
尝试这个
SELECT u.login,u.type, SUM(IF(m.date>1388710861,m.amount,0)) as amount
FROM users AS u
LEFT JOIN money AS m ON m.login=u.login
GROUP BY u.login, u.type;
当然,它会慢一点。
答案 1 :(得分:0)
查看您的数据, 没有符合您条件的数据(日期> 1388710861)。 实际上,列数总是为0。
这是获得每次登录总金额的标准查询。
SELECT u.login,u.type, SUM(m.amount) as amount
FROM users AS u
LEFT JOIN money AS m ON m.login=u.login
GROUP BY u.login, u.type;
但是,如果你想得到结果, 每个登录的总金额(日期> 1388710861)将预览实际金额 如果(日期< = 1388710861)将预览0
你可以试试这个:
SELECT u.login,u.type,
Sum(Case When date>1388710861 Then m.amount Else 0 End) as amount
FROM users AS u
LEFT JOIN money AS m ON m.login=u.login
GROUP BY u.login, u.type;