From cf945e8ffb65311f061710cfe1bec86186027ce7 Mon Sep 17 00:00:00 2001 From: Sam Chaffee Date: Fri, 2 Oct 2015 11:28:15 -0600 Subject: [PATCH] MDL-51514 gradebook: Optimize set_usedinaggregation query for MySQL --- lib/grade/grade_category.php | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/lib/grade/grade_category.php b/lib/grade/grade_category.php index 9764dc2a327..e7f50af71cc 100644 --- a/lib/grade/grade_category.php +++ b/lib/grade/grade_category.php @@ -793,15 +793,28 @@ class grade_category extends grade_object { // 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);