From e9a554e24e203bb93c73598d05d65a2ca253b0b7 Mon Sep 17 00:00:00 2001 From: Adrian Greeve Date: Tue, 15 Sep 2015 13:50:03 +0800 Subject: [PATCH] MDL-51241 cohorts: Update to cohort query. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This improves the speed of returning a list of cohorts. Thanks to François Gannaz for providing this patch. --- cohort/lib.php | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/cohort/lib.php b/cohort/lib.php index e859cacb0b658..5c515782c889d 100644 --- a/cohort/lib.php +++ b/cohort/lib.php @@ -256,15 +256,17 @@ function cohort_get_available_cohorts($currentcontext, $withmembers = 0, $offset $groupbysql = ''; $havingsql = ''; if ($withmembers) { - $groupbysql = " GROUP BY $fieldssql"; + $fieldssql .= ', s.memberscnt'; + $subfields = "c.id, COUNT(DISTINCT cm.userid) AS memberscnt"; + $groupbysql = " GROUP BY c.id"; $fromsql = " LEFT JOIN {cohort_members} cm ON cm.cohortid = c.id "; - $fieldssql .= ', COUNT(DISTINCT cm.userid) AS memberscnt'; if (in_array($withmembers, array(COHORT_COUNT_ENROLLED_MEMBERS, COHORT_WITH_ENROLLED_MEMBERS_ONLY, COHORT_WITH_NOTENROLLED_MEMBERS_ONLY))) { list($esql, $params2) = get_enrolled_sql($currentcontext); $fromsql .= " LEFT JOIN ($esql) u ON u.id = cm.userid "; $params = array_merge($params2, $params); - $fieldssql .= ', COUNT(DISTINCT u.id) AS enrolledcnt'; + $fieldssql .= ', s.enrolledcnt'; + $subfields .= ', COUNT(DISTINCT u.id) AS enrolledcnt'; } if ($withmembers == COHORT_WITH_MEMBERS_ONLY) { $havingsql = " HAVING COUNT(DISTINCT cm.userid) > 0"; @@ -280,13 +282,20 @@ function cohort_get_available_cohorts($currentcontext, $withmembers = 0, $offset $params = array_merge($params, $searchparams); } - $sql = "SELECT $fieldssql - FROM {cohort} c - $fromsql - WHERE $wheresql - $groupbysql - $havingsql - ORDER BY c.name, c.idnumber"; + if ($withmembers) { + $sql = "SELECT " . str_replace('c.', 'cohort.', $fieldssql) . " + FROM {cohort} cohort + JOIN (SELECT $subfields + FROM {cohort} c $fromsql + WHERE $wheresql $groupbysql $havingsql + ) s ON cohort.id = s.id + ORDER BY cohort.name, cohort.idnumber"; + } else { + $sql = "SELECT $fieldssql + FROM {cohort} c $fromsql + WHERE $wheresql + ORDER BY c.name, c.idnumber"; + } return $DB->get_records_sql($sql, $params, $offset, $limit); }