Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 一个复杂的SQL语句,使用3个带有状态检查的表_Mysql_Sql - Fatal编程技术网

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