diff --git a/lib/grade/grade_category.php b/lib/grade/grade_category.php index 9764dc2a32721..e7f50af71ccd1 100644 --- a/lib/grade/grade_category.php +++ b/lib/grade/grade_category.php @@ -793,15 +793,28 @@ private function set_usedinaggregation($userid, $usedweights, $novalue, $dropped // Reset aggregation to unknown and 0 for all grade items for this user and category. $params = array('categoryid' => $this->id, 'userid' => $userid); - $itemssql = "SELECT id - FROM {grade_items} - WHERE categoryid = :categoryid"; - - $sql = "UPDATE {grade_grades} - SET aggregationstatus = 'unknown', - aggregationweight = 0 - WHERE userid = :userid - AND itemid IN ($itemssql)"; + + switch ($DB->get_dbfamily()) { + case 'mysql': + // Optimize the query for MySQL by using a join rather than a sub-query. + $sql = "UPDATE {grade_grades} g + JOIN {grade_items} gi ON (g.itemid = gi.id) + SET g.aggregationstatus = 'unknown', + g.aggregationweight = 0 + WHERE g.userid = :userid + AND gi.categoryid = :categoryid"; + break; + default: + $itemssql = "SELECT id + FROM {grade_items} + WHERE categoryid = :categoryid"; + + $sql = "UPDATE {grade_grades} + SET aggregationstatus = 'unknown', + aggregationweight = 0 + WHERE userid = :userid + AND itemid IN ($itemssql)"; + } $DB->execute($sql, $params);