我有两张桌子,'授权'和'交易'。
授权表
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
我认为查询相对简单。
答案 0 :(得分:1)
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。
这是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