Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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中的连续缺席_Mysql - Fatal编程技术网

MySQL中的连续缺席

MySQL中的连续缺席,mysql,Mysql,我的数据库中有两个表:学生和缺席。在学生中:id_学生,s_姓名;在缺席的情况下:学生身份证,日期,日期一周中的哪一天作为数字并不重要; 我想了解连续缺课超过2天的学生和日期 现在我有下一个问题: /*To control when the days are in the same week*/ SELECT id_student, date, dayname(date),date_add(date, INTERVAL 1 DAY) AS a, dayname(date_add(da

我的数据库中有两个表:学生和缺席。在学生中:id_学生,s_姓名;在缺席的情况下:学生身份证,日期,日期一周中的哪一天作为数字并不重要; 我想了解连续缺课超过2天的学生和日期

现在我有下一个问题:

 /*To control when the days are in the same week*/  
SELECT id_student, date, dayname(date),date_add(date, INTERVAL 1 DAY) AS a,  
 dayname(date_add(date, INTERVAL 1 DAY)) AS an, date_add(date, INTERVAL 2 DAY) AS b,  
 dayname(date_add(date, INTERVAL 2 DAY)) AS bn  
FROM absences AS a  
WHERE id_student IN  
                (SELECT id_student FROM absences   
                  WHERE id_student = a.id_student  
                  AND date = date_add(a.date, INTERVAL 1 DAY) )  
AND id_student IN  
               (SELECT id_student FROM absences  
                 WHERE id_student = a.id_student  
                 AND date = date_add(a.date,INTERVAL 2 DAY) )  
UNION  
/*To control when the days jump to the next week*/  
SELECT id_student, date, dayname(date),date_add(date, INTERVAL 3 DAY) AS a,  
 dayname(date_add(date, INTERVAL 3 DAY)) AS an, date_add(date, INTERVAL 4 DAY) AS b,  
 dayname(date_add(date, INTERVAL 4 DAY)) AS bn  
FROM absences AS a  
WHERE id_student IN  
               (SELECT id_student FROM absences  
                 WHERE id_student = a.id_student  
                  AND date = date_add(a.date, INTERVAL 3 DAY) )  
AND id_student IN  
                (SELECT id_student FROM absences  
                  WHERE id_student = a.id_student  
                  AND date = date_add(a.date,INTERVAL 4 DAY) )  
/* To avoid the case (Monday-Thursday-Friday) to be consider as consecutive days*/  
AND WEEKDAY(date) !=0   
现在我得到了这样的东西:

3000000 2010-05-10  Monday  2010-05-11  Tuesday         2010-05-12  Wednesday 
3000000 2010-05-11  Tuesday 2010-05-12  Wednesday     2010-05-13    Thursday 
3000000 2010-05-07  Friday  2010-05-10  Monday          2010-05-11  Tuesday 
3000001 2010-05-14  Friday  2010-05-17  Monday          2010-05-18  Tuesday
但它显示了连续休息3天的列表。我想得到更类似的东西:

3000000 2010-05-10  Monday  2010-05-11  Tuesday         2010-05-12  Wednesday  2010-05-13   Thursday 
3000000 2010-05-07  Friday  2010-05-10  Monday          2010-05-11  Tuesday 
3000001 2010-05-14  Friday  2010-05-17  Monday          2010-05-18  Tuesday

谢谢

这不是完整的解决方案,此查询未经测试,但它演示了如何使用自联接获取三次或更多缺席中的第一条记录:

SELECT a.id_student, a.date, DAYNAME(a.date) FROM absences a
JOIN absences a2
ON a2.id_student = a.id_student AND (a2.date = date_add(a.date, INTERVAL 1 DAY) OR (DAYNAME(a.date) = 'Friday' AND a2.date = date_add(a.date, INTERVAL 3 DAY)))
JOIN absences a3
ON a3.id_student = a.id_student AND (a3.date = date_add(a2.date, INTERVAL 1 DAY) OR
(DAYNAME(a3.date) = 'Friday' AND a3.date = date_add(a2.date, INTERVAL 3 DAY)))
LEFT JOIN absences a4
ON a4.id_student = a.id_student AND (a4.date = date_add(a.date, INTERVAL -1 DAY) OR
(DAYNAME(a4.date) = 'Monday' AND a4.date = date_add(a.date, INTERVAL -3 DAY)))
WHERE a4.id_student IS NULL

使用联接获取序列,使用左联接仅获取前一天没有缺勤的记录以获取第一条记录。

因此,现在我可以添加下一条:>选择a.id\u student、a.date、DAYNAMEa.date-day、a2.date、DAYNAMEa.date-day、a3.date、DAYNAMEa.date-day以获取三个日期。但是,如果一个学生缺席10次,我如何获得日期列表?目标是使用php将其显示在表中。