MySQL考勤系统

时间:2015-05-20 05:25:36

标签: mysql

我为一个项目制作了一个考勤系统,但是我现在因为尝试创建一个查询而陷入困境。

SELECT
COUNT(Students.idStudents) total,
SUM(case when Attendance.status LIKE 'present' then 1 else 0 end) present,
SUM(case when Attendance.status LIKE 'late' then 1 else 0 end) late,
SUM(case when Attendance.status is null then 1 else 0 end) absents
FROM Students, Schools, Tags LEFT JOIN Attendance 
ON Attendance.tagCode = Tags.tagCode
WHERE Schools.idSchools = Students.idSchools
AND Tags.idStudents = Students.idStudents

此代码可以生成并生成出席。但是,这将显示所有日期。

当我添加另一行以指定日期

AND Attendance.date = DATE(NOW()); 

它不会显示任何内容..

出席时有“现在”,“迟到”状态,但如果学生在该表中的记录不存在,则视为缺席。

我该怎么做?

ERD

3 个答案:

答案 0 :(得分:2)

假设您使用不区分大小写的排序规则,可以按如下方式重写您声称的解决方案:

SELECT COUNT(p.idStudents) total
     , SUM(CASE WHEN a.status = 'present' THEN 1 ELSE 0 END) present -- [or just SUM(a.status = 'present')]
     , SUM(CASE WHEN a.status = 'late' THEN 1 ELSE 0 END) late
     , SUM(CASE WHEN a.status IS NULL THEN 1 ELSE 0 END) absents
  FROM Students p
  JOIN Schools s
    ON s.idSchools = p.idSchools
  JOIN Tags t
    ON t.idStudents = p.idStudents
  LEFT 
  JOIN Attendance a 
    ON a.tagCode = t.tagCode
   AND a.date = CURDATE() ;

下次:您的ERD显示10个表,但此问题中只有4个功能。如果表格不太可能是建议解决方案的一部分,请不要显示。不提供图片。相反,在可能的情况下,提供适当的DDL(和/或sqlfiddle),与期望的结果集合在一起,基于最小但适当代表的数据集。

欢迎来到SO。

答案 1 :(得分:0)

想出来......

SELECT
COUNT(Students.idStudents) total,
SUM(case when Attendance.status LIKE 'present' then 1 else 0 end) present,
SUM(case when Attendance.status LIKE 'late' then 1 else 0 end) late,
SUM(case when Attendance.status is null then 1 else 0 end) absents
FROM Students, Schools, Tags LEFT JOIN (SELECT * FROM Attendance WHERE Attendance.date = NOW()) AS Attendance
ON Attendance.tagCode = Tags.tagCode
WHERE Schools.idSchools = Students.idSchools
AND Tags.idStudents = Students.idStudents

答案 2 :(得分:0)

原始查询的问题是你要求学生出席的地点是"现在"现在没有学生,但他们目前正在上课。他们可能已于上午8点登录,并在上午10点运行查询。您需要操纵日期时间,根据当天选择开始时间和结束时间。

timestampadd(HOUR,08,CURDATE()) - 这将为您提供早上8点,然后您在查看出勤时间是否大于或等于上午8点然后可能小于或等于下午4点?< / p>