MySQL SUM 0在JOIN上没有结果

时间:2017-12-29 18:15:11

标签: php mysql sql join

我有两张桌子,'授权'和'交易'。

授权

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 的用户,如下所示:

QUERY

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

我认为查询相对简单。

2 个答案:

答案 0 :(得分:1)

JOIN语句是INNER JOIN的快捷方式,它返回两个表中具有匹配值的记录。如果要从一个表中返回所有记录以及从另一个表中返回匹配的记录,则应使用外部联接(LEFT [OUTER] JOINRIGHT [OUTER] JOIN)。然后,您可以使用IFNULL()COALESCE()函数将NULL转换为零:

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

答案 1 :(得分:0)

此查询适用于任何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