我正在尝试开发一个简单的php出勤系统,但我遇到了麻烦。我想以这种形式从出勤表中生成出勤报告:
sid | present(%) | late(%) | permission(%) | absent (%) |
| | | | |
我遇到的问题是我无法计算出勤表中所有学生的百分比。我的出勤表的结构是:
sid| course | smister| section | attendance_status | date |
| | | | | |
代码可能像这样:
$query=slect * from attendance where course=course And semister = semister and section = section;
$result=mysqli_query(..,..);
while($row=$result_>fetch_assoc()){
//here calculate all selected students ateendance status in the above form
}
最佳答案
如果要在PHP中执行此操作,则似乎需要“计数”“当前”,“迟到”,“许可”和“缺席”记录的出现次数,以及记录总数。以及每个sid
的值(我们假定是学生ID)。
按sid
对行进行排序,并使用常规的控制中断处理。当我们得到与上一行不同的sid
行时,我们就完成了上一个sid
,因此发出所有计数器,并执行任何计算。
然后重置计数器,为积累此新学生做好准备。
我建议将其作为一个更简单的问题进行处理,例如,仅计算每个sid
的行数。一旦可行,可以扩展相同的模式以保留多个计数器,并根据行中的信息有条件地增加计数器。 (例如,仅对表示缺席的行增加“缺席”计数器。
另一种选择是使用条件聚合完全避免PHP中的繁琐操作,而仅让SQL返回结果。
最简单的形式,获取每个sid
的行数
SELECT a.sid
, COUNT(*) AS tot
FROM attendance a
GROUP BY a.sid
ORDER BY a.sid
添加适当的WHERE子句(在
GROUP BY
子句之前)以限制我们要查看的行。我们可以根据条件扩展相同的模式,以获得其他计数。我们只是在猜测
attendance
表中有哪些列,以及我们如何确定该行是否指示缺席...SELECT a.sid
, SUM(1) AS tot
, SUM(a.attendance_code = 'Absent') AS cnt_absent
, SUM(a.attendance_code = 'Tardy' ) AS cnt_late
, 100.0
* SUM(a.attendance_code = 'Absent')
/ SUM(1) AS pct_absent
, 100.0
* SUM(a.attendance_code = 'Tardy' )
/ SUM(1) AS pct_late
FROM attendance a
GROUP BY a.sid
ORDER BY a.sid
关于php - 我如何使用php从mysql计算出勤率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49988836/