mysql - 从考勤表中报告 N 次或多次连续缺席的 SQL 查询

标签 mysql sql select count aggregate-functions

我有一个看起来像这样的表:

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 解决方案:

  1. 从表中选择所有行,按学生、主题和日期排序
  2. 为缺席创建一个运行计数器,初始化为0
  3. 遍历每条记录:
    • 如果学生和/或科目与上一行不同
      • 将计数器重置为 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/

相关文章:

php - 在单列中选择两个表的不同字段?

c# - 如果存在则从列中选择,如果不存在值为 NULL

java - 如何在selenium中打印通过 'selectByVisibleText'方法选择的所选选项的文本

sql - PostgreSQL,FROM后面的结尾代表什么?

MySQL - 如何使用 LIKE 搜索精确的单词匹配?

css - html 中的样式选择和选项 (IE 6)

mysql - 计算(多个)MySQL 查询的重叠结果

当 JOIN 的表之一没有任何数据时,MySql 返回空结果

sql - 优化 SQL 查询以避免哈希匹配(聚合)

mysql - 选择一定值的数据