MDL-55776 enrol: Optimise enrolled users listing.
Here we optimise SQL queries for enrolled users list. Expensive subquery is replaced with faster LEFT JOIN and the whole groups filtering component is aded on demand.
This commit is contained in:
committed by
Eloy Lafuente (stronk7)
parent
3df86df503
commit
bfe06f7600
+12
-14
@@ -171,13 +171,12 @@ class course_enrolment_manager {
|
||||
$sqltotal = "SELECT COUNT(DISTINCT u.id)
|
||||
FROM {user} u
|
||||
JOIN {user_enrolments} ue ON (ue.userid = u.id AND ue.enrolid $instancessql)
|
||||
JOIN {enrol} e ON (e.id = ue.enrolid)
|
||||
LEFT JOIN {groups_members} gm ON u.id = gm.userid AND gm.groupid IN (
|
||||
SELECT g.id
|
||||
FROM {groups} g
|
||||
WHERE g.courseid = e.courseid
|
||||
)
|
||||
WHERE $filtersql";
|
||||
JOIN {enrol} e ON (e.id = ue.enrolid)";
|
||||
if ($this->groupfilter) {
|
||||
$sqltotal .= " LEFT JOIN ({groups_members} gm JOIN {groups} g ON (g.id = gm.groupid))
|
||||
ON (u.id = gm.userid AND g.courseid = e.courseid)";
|
||||
}
|
||||
$sqltotal .= "WHERE $filtersql";
|
||||
$this->totalusers = (int)$DB->count_records_sql($sqltotal, $params);
|
||||
}
|
||||
return $this->totalusers;
|
||||
@@ -245,13 +244,12 @@ class course_enrolment_manager {
|
||||
FROM {user} u
|
||||
JOIN {user_enrolments} ue ON (ue.userid = u.id AND ue.enrolid $instancessql)
|
||||
JOIN {enrol} e ON (e.id = ue.enrolid)
|
||||
LEFT JOIN {user_lastaccess} ul ON (ul.courseid = e.courseid AND ul.userid = u.id)
|
||||
LEFT JOIN {groups_members} gm ON u.id = gm.userid AND gm.groupid IN (
|
||||
SELECT g.id
|
||||
FROM {groups} g
|
||||
WHERE g.courseid = e.courseid
|
||||
)
|
||||
WHERE $filtersql
|
||||
LEFT JOIN {user_lastaccess} ul ON (ul.courseid = e.courseid AND ul.userid = u.id)";
|
||||
if ($this->groupfilter) {
|
||||
$sql .= " LEFT JOIN ({groups_members} gm JOIN {groups} g ON (g.id = gm.groupid))
|
||||
ON (u.id = gm.userid AND g.courseid = e.courseid)";
|
||||
}
|
||||
$sql .= "WHERE $filtersql
|
||||
ORDER BY $sort $direction";
|
||||
$this->users[$key] = $DB->get_records_sql($sql, $params, $page*$perpage, $perpage);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user