【问题标题】:Return null value instead of the empty set in sql query返回空值而不是sql查询中的空集
【发布时间】:2014-10-12 14:43:50
【问题描述】:

假设有两个表:

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

我需要从用户表中选择登录和类型字段,并从所选日期范围内的第二个表中选择金额字段的 SUM。如果所选期间的 sum 为空或“money”表中没有任何登录记录,则返回零值(非空集)。

我的做法如下:

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

这怎么可能?

【问题讨论】:

  • 我想要得到的结果已经发布了。请看一看。
  • 我已经尝试过 COALESCE。不走运,返回相同的空集。我的情况因使用多个连接而变得复杂,我想正确的方法在于改变表的连接方式。我已经尝试了多种变体,甚至是子查询,但得到了相同的结果。另外,我已经搜索过类似的案例Stackoverflow,但没有找到。

标签: mysql sql join left-join


【解决方案1】:

它是空的,因为您的 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;

当然,它会运行得更慢。

【讨论】:

    【解决方案2】:

    查看您的数据, 没有符合您标准的数据( date>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)将预览实际总金额 万一(日期

    你可以试试这个:

    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;
    

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      相关资源
      最近更新 更多