![](/img/trans.png)
[英]MySQL Multiplied query result (LEFT JOIN, SUM, COUNT, GROUP BY)
[英]MySQL SUM 0 for no result on 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的用户为0.见下文:
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
我认为查询相对简单。
JOIN
语句是INNER JOIN
的快捷方式,它返回两个表中具有匹配值的记录。 如果要返回一个表中的所有记录以及另一个表中的匹配记录,则应使用外连接( LEFT [OUTER] JOIN
或RIGHT [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。
以下是关于不同类型的连接表的很好的说明 。
此查询适用于任何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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.