我有一个看起来像这样的表:
studentID | subjectID | attendanceStatus | classDate | classTime | lecturerID |
12345678 1234 1 2012-06-05 15:30:00
87654321
12345678 1234 0 2012-06-08 02:30:00
我想要一个查询来报告学生是否缺席 3 次或更多次连续类(class)。 基于学生 ID 和 2 个特定日期之间的特定主题。每个类(class)可以有不同的时间。该表的架构是:
PK(`studentID`, `classDate`, `classTime`, `subjectID, `lecturerID`)
出勤状态:1 = 出席,0 = 缺席
编辑:问题措辞更准确,真正描述了我的意图。
最佳答案
我无法为此创建 SQL 查询。因此,我尝试了一个 PHP 解决方案:
- 从表中选择所有行,按学生、主题和日期排序
- 为缺席创建一个运行计数器,初始化为
0
- 遍历每条记录:
- 如果学生和/或科目与上一行不同
- 将计数器重置为 0(存在)或 1(不存在)
- 否则,当学生和主题相同时
- 将计数器设置为 0(存在)或加 1(不存在)
- 如果学生和/或科目与上一行不同
然后我意识到可以使用 MySQL 变量轻松实现此逻辑,因此:
SET @studentID = 0;
SET @subjectID = 0;
SET @absentRun = 0;
SELECT *,
CASE
WHEN (@studentID = studentID) AND (@subjectID = subjectID) THEN @absentRun := IF(attendanceStatus = 1, 0, @absentRun + 1)
WHEN (@studentID := studentID) AND (@subjectID := subjectID) THEN @absentRun := IF(attendanceStatus = 1, 0, 1)
END AS absentRun
FROM table4
ORDER BY studentID, subjectID, classDate
您可以将此查询嵌套在另一个查询中,该查询选择 absentRun >= 3
的记录。
SQL Fiddle
关于mysql - 从考勤表中报告 N 次或多次连续缺席的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10562495/