MDL-85637 question: Optimize max question version SQL query

This commit is contained in:
Iñigo Zendegi
2026-03-11 11:46:47 +01:00
parent 2baad2002f
commit 8a27867a0d
8 changed files with 92 additions and 73 deletions
+21 -15
View File
@@ -81,22 +81,28 @@ function get_questions_category(object $category, bool $noparent, bool $recurse
list($usql, $params) = $DB->get_in_or_equal($categorylist);
// Get the latest version of a question.
$version = '';
if ($latestversion) {
$version = 'AND (qv.version = (SELECT MAX(v.version)
FROM {question_versions} v
JOIN {question_bank_entries} be
ON be.id = v.questionbankentryid
WHERE be.id = qbe.id) OR qv.version is null)';
}
$questions = $DB->get_records_sql("SELECT q.*, qv.status, qc.id AS category
FROM {question} q
JOIN {question_versions} qv ON qv.questionid = q.id
JOIN {question_bank_entries} qbe ON qbe.id = qv.questionbankentryid
JOIN {question_categories} qc ON qc.id = qbe.questioncategoryid
WHERE qc.id {$usql} {$npsql} {$version}
ORDER BY qc.id, q.qtype, q.name", $params);
$sql = "SELECT q.*, qv.status, qc.id AS category
FROM {question} q
JOIN {question_versions} qv ON qv.questionid = q.id";
if ($latestversion) {
$sql .= " LEFT JOIN {question_versions} qv2 ON ( qv2.questionbankentryid = qv.questionbankentryid
AND qv2.version > qv.version
)";
}
$sql .= " JOIN {question_bank_entries} qbe ON qbe.id = qv.questionbankentryid
JOIN {question_categories} qc ON qc.id = qbe.questioncategoryid
WHERE qc.id {$usql} {$npsql}";
if ($latestversion) {
$sql .= " AND (qv2.questionbankentryid IS NULL
OR qv.version IS NULL)";
}
$sql .= " ORDER BY qc.id, q.qtype, q.name";
$questions = $DB->get_records_sql($sql, $params);
// Iterate through questions, getting stuff we need.
$qresults = [];
foreach ($questions as $question) {