返回null值而不是sql查询中的空集

时间:2014-10-12 14:43:50

标签: mysql sql join left-join

让我们说,有两个表:

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  |
+-------+------+--------+

这怎么可能?

2 个答案:

答案 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;