也许有人可以对我一整天都在与之抗争的声明有所了解:)
我有 3 张桌子
假期
holidayID | userID | dateFrom | dateTo
1 | 1 | 2012-01-01 | 2012-01-01
2 | 1 | 2012-01-15 | 2012-01-20
地位
statusID | holidayID | statusText
1 | 1 | accepted
2 | 2 | declined
用户设置
id | userID | HolidaysAllowed
1 | 1 | 20
我想要做的是得到以下结果
结果
HolidaysAllowed | HolidaysLeft (Allowed - Taken) | HolidaysTaken (Sum of Holidays)
20 | 19 | 1
如果我不说明状态,我可以获得所有三列 - 这是我得到的最接近的
SELECT
IFNULL(SUM( IF( h.dateTo = h.dateFrom, 1, DATEDIFF( h.dateTo, h.dateFrom ) ) ), 0) AS holidaysTaken,
IFNULL(us.HolidaysAllowed - ( SUM( IF( h.DateTo = h.DateFrom, 1, DATEDIFF( h.DateTo, h.dateFrom ) ) ) ), 0) AS holidaysLeftover,
us.HolidaysAllowed
FROM userSettings us
LEFT JOIN holiday h
ON h.userID = 1
JOIN status s
ON s.holidayID = h.holidayID AND s.statusID = 1
WHERE
us.userID = 1
GROUP BY h.userID;
主要问题是,如果没有 statusID = 2 的假期,则结果列 1 和 2 为 0(这是正确的)但第 3 列(HolidaysAllowed)为 NULL(不正确,因为它需要始终从表 UserSettings 返回值) . 仅当至少有 1 条记录(假期)具有正确的状态时,上述查询才会返回正确的响应......我做错了什么?:)
它只是让我发疯:)提前感谢您的帮助!非常感激!
更新
感谢所有评论的人......预期结果如下获取所有状态= 1(即接受)的假期,然后根据允许的假期计算假期统计数据。IE
总共 20 天,接受 1 个假期 = 还剩 19 天
再次感谢