【问题标题】:MySQL SUM 0 for no result on JOINMySQL SUM 0 对于 JOIN 没有结果
【发布时间】:2018-06-10 03:14:31
【问题描述】:

我有两个表,“授权”和“交易”。

授权表

Auth_ID | User_ID | Auth_Hours
-------------------------------
5       | 1       | 60
6       | 2       | 40
7       | 3       | 50

交易表

Auth_ID | User_ID | Used_Hours
-------------------------------
5       | 1       | 5
6       | 2       | 2
5       | 1       | 20
6       | 2       | 17
5       | 1       | 11
6       | 2       | 9

我希望我的查询汇总 Used_Hours 并按交易表中的 Auth_ID 和 User_ID 分组。这就是问题所在 - 我还希望查询结果显示未使用任何 Auth_Hours 的用户为 0。见下文:

查询

SELECT a.Auth_ID, a.USER_ID, a.Auth_Hours, SUM(t.Used_Hours)
FROM AUTHORIZATION a
JOIN TRANSACTION t
on a.Auth_ID = t.Auth_ID
and a.User_ID = t.User_ID
GROUP BY a.Auth_ID, a.USER_ID, a.Auth_Hours

实际结果

Auth_ID | User_ID | Auth_Hours | Total Hours Used
-------------------------------------------------
5       | 1       | 60         | 36
6       | 2       | 40         | 28

想要的结果

Auth_ID | User_ID | Auth_Hours | Total Hours Used
-------------------------------------------------
5       | 1       | 60         | 36
6       | 2       | 40         | 28
7       | 3       | 50         | 0

我认为查询相对简单。

【问题讨论】:

  • 编辑您的问题并显示您的查询。然后将JOIN 替换为LEFT JOIN。
  • 我输入了我的查询。我将尝试使用 LEFT JOIN

标签: php mysql sql join


【解决方案1】:

JOIN 语句是INNER JOIN 的快捷方式,它返回在两个表中具有匹配值的记录。如果您想从一个表返回所有记录并从另一个表返回匹配的记录,那么您应该使用外连接(LEFT [OUTER] JOIN 或RIGHT [OUTER] JOIN)。然后您可以使用IFNULL() 或COALESCE()函数将NULLs 转换为零:

SELECT a.Auth_ID, a.USER_ID, a.Auth_Hours, IFNULL(SUM(t.Used_Hours), 0) AS 'Total Hours Used'
FROM authorization a
LEFT JOIN transaction t ON a.Auth_ID = t.Auth_ID AND a.User_ID = t.User_ID
GROUP BY a.Auth_ID, a.USER_ID, a.Auth_Hours

请注意,我使用单引号将带有空格的字符串作为名称分配给总字段(正如您在示例中使用的那样)。这将适用于所有数据库。在 MySQL 中,您也可以使用反引号,但这仅适用于 MySQL。

这是good illustration about the different types of joining tables。

【讨论】:

  • 感谢您的帮助!看起来 IFNULL() 是 MySQL 的 ISNULL() 等价物。不管怎样,你摇滚。如果你更新你的答案,我会接受。
  • 是的,在 MySQL 中,您可以使用IFNULL() 函数或COALESCE() 函数。
【解决方案2】:

此查询适用于任何 mysql 引擎或版本。使用这个查询:

SELECT a.Auth_ID, a.USER_ID, a.Auth_Hours, CASE COUNT(t.Used_Hours) WHEN 0 THEN 0 ELSE SUM(t.Used_Hours) END AS 'Total Hours Used'
FROM authorization a
LEFT JOIN TRANSACTION t ON a.Auth_ID = t.Auth_ID AND a.User_ID = t.User_ID
GROUP BY a.Auth_ID, a.USER_ID, a.Auth_Hours

【讨论】:

  • COUNT() 只记录实例数,不记录实际总数。
  • 当我返回总和(t.Used_Hours)时。如果有帮助告诉我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
相关资源
最近更新 更多