Mysql 一个复杂的SQL语句,使用3个带有状态检查的表
也许有人可以解释一下我一整天都在争论的一句话:) 我有三张桌子 假日Mysql 一个复杂的SQL语句,使用3个带有状态检查的表,mysql,sql,Mysql,Sql,也许有人可以解释一下我一整天都在争论的一句话:) 我有三张桌子 假日 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 |
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
用户设置
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(即已接受)的所有假期,然后根据允许的假期统计信息计算假期统计信息。即
总共20天,接受1个假期=剩余19天
再次感谢以下查询不考虑周末
SELECT B.HolidaysAllowed AS HolidaysAllowed,
B.HolidaysAllowed-A.HolidaysTaken AS HolidaysLeft,
A.HolidaysTaken AS HolidaysTaken
FROM
(
SELECT A.userID,SUM(CASE WHEN DATEDIFF(A.dateTo,A.dateFom)=0
THEN 1
ELSE DATEDIFF(A.dateTo,A.dateFom)
) AS HolidaysTaken
FROM Holiday A,Status B
WHERE A.holidayID = B.holidayID
AND A.statusText='accepted'
GROUP BY useID
) A,
UserSettings B
WHERE A.userID = B.userID;
脚本:
输出:
以下查询不考虑周末 脚本: 输出:
你能发布一些示例数据和所需的o吗/p@Vutukuri-谢谢你的评论。。。我已经更新了我的问题。湿婆。。。statusID可以有n个可能性。周末呢?我们应该假设周六/周日不算吗?你能发布一些样本数据和期望的o吗/p@Vutukuri-谢谢你的评论。。。我已经更新了我的问题。湿婆。。。statusID可以有n个可能性。周末呢?我们应该假设星期六/星期日不算吗?目前的这个查询实际上比问题中发布的原始版本更不正确。它不会检查状态表以确定是否接受或拒绝假日,它不会正确计算单日假日,也不会处理尚未使用任何假日的员工将遇到的空值。它仍然不正确。DATEDIFF本身不能用于计算假期覆盖的天数,因为DATEDIFF的答案中从不包括第一天。原始问题要求将周一到周五的假期报告为五天,而不是DATEDIFF在您告诉它从周五的日期减去周一的日期时给您的四天时间。目前的查询实际上不如问题中发布的原始版本正确。它不会检查状态表以确定是否接受或拒绝假日,它不会正确计算单日假日,也不会处理尚未使用任何假日的员工将遇到的空值。它仍然不正确。DATEDIFF本身不能用于计算假期覆盖的天数,因为DATEDIFF的答案中从不包括第一天。原始问题要求将周一到周五的假期报告为五天,而不是DATEDIFF在您告诉它从周五日期减去周一日期时提供的四天持续时间。此查询假设假期表中定义的每个从/到持续时间仅包括工作日,不包括周末,因此,两周的假期需要定义为一对M-F假期。它还假设以前的报告期间(如去年)没有假日记录。此查询假设假日表中定义的每个从/到持续时间仅包括工作日,而不包括周末,因此两周的假日需要定义为一对M-F假日。它还假设没有以前报告期的假日记录,例如去年。
USERID HOLIDAYSALLOWED HOLIDAYSLEFT HOLIDAYSTAKEN
------ --------------- ------------ -------------
1 5 5 0
2 10 5 5
3 7 3 4
4 6 6 0