From 5bddb944c0b912ef3f0bc74ff3d99dfae3be1300 Mon Sep 17 00:00:00 2001 From: NeillM Date: Fri, 16 Aug 2013 11:22:55 +0100 Subject: [PATCH] Fix for sessions with taken attendance show twice in student report. The two queries have been refactored into a single query using UNION --- locallib.php | 48 ++++++++++++++++++++++-------------------------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/locallib.php b/locallib.php index d26e464..bc57d6c 100644 --- a/locallib.php +++ b/locallib.php @@ -1101,50 +1101,46 @@ class attendance { // All taked sessions (including previous groups). + $groups = array_keys(groups_get_all_groups($this->course->id, $userid)); + $groups[] = 0; + list($gsql, $gparams) = $DB->get_in_or_equal($groups, SQL_PARAMS_NAMED, 'gid0'); + if ($this->pageparams->startdate && $this->pageparams->enddate) { $where = "ats.attendanceid = :aid AND ats.sessdate >= :csdate AND ats.sessdate >= :sdate AND ats.sessdate < :edate"; + $where2 = "ats.attendanceid = :aid2 AND ats.sessdate >= :csdate2 AND + ats.sessdate >= :sdate2 AND ats.sessdate < :edate2 AND ats.groupid $gsql"; } else { $where = "ats.attendanceid = :aid AND ats.sessdate >= :csdate"; + $where2 = "ats.attendanceid = :aid2 AND ats.sessdate >= :csdate2 AND ats.groupid $gsql"; } $sql = "SELECT ats.id, ats.groupid, ats.sessdate, ats.duration, ats.description, al.statusid, al.remarks FROM {attendance_sessions} ats - RIGHT JOIN {attendance_log} al + RIGHT JOIN {attendance_log} al ON ats.id = al.sessionid AND al.studentid = :uid WHERE $where - ORDER BY ats.sessdate ASC"; + UNION + SELECT ats.id, ats.groupid, ats.sessdate, ats.duration, ats.description, al.statusid, al.remarks + FROM {attendance_sessions} ats + LEFT JOIN {attendance_log} al + ON ats.id = al.sessionid AND al.studentid = :uid2 + WHERE $where2 + ORDER BY sessdate ASC"; $params = array( 'uid' => $userid, 'aid' => $this->id, 'csdate' => $this->course->startdate, 'sdate' => $this->pageparams->startdate, - 'edate' => $this->pageparams->enddate); - $sessions = $DB->get_records_sql($sql, $params); - - // All sessions for current groups. - - $groups = array_keys(groups_get_all_groups($this->course->id, $userid)); - $groups[] = 0; - list($gsql, $gparams) = $DB->get_in_or_equal($groups, SQL_PARAMS_NAMED, 'gid0'); - - if ($this->pageparams->startdate && $this->pageparams->enddate) { - $where = "ats.attendanceid = :aid AND ats.sessdate >= :csdate AND - ats.sessdate >= :sdate AND ats.sessdate < :edate AND ats.groupid $gsql"; - } else { - $where = "ats.attendanceid = :aid AND ats.sessdate >= :csdate AND ats.groupid $gsql"; - } - - $sql = "SELECT ats.id, ats.groupid, ats.sessdate, ats.duration, ats.description, al.statusid, al.remarks - FROM {attendance_sessions} ats - LEFT JOIN {attendance_log} al - ON ats.id = al.sessionid AND al.studentid = :uid - WHERE $where - ORDER BY ats.sessdate ASC"; - + 'edate' => $this->pageparams->enddate, + 'uid2' => $userid, + 'aid2' => $this->id, + 'csdate2' => $this->course->startdate, + 'sdate2' => $this->pageparams->startdate, + 'edate2' => $this->pageparams->enddate); $params = array_merge($params, $gparams); - $sessions = array_merge($sessions, $DB->get_records_sql($sql, $params)); + $sessions = $DB->get_records_sql($sql, $params); foreach ($sessions as $sess) { if (empty($sess->description)) {