diff --git a/admin/qtypes.php b/admin/qtypes.php index 7f0714feeb7..84986ebd706 100644 --- a/admin/qtypes.php +++ b/admin/qtypes.php @@ -24,6 +24,7 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ +use core_question\local\bank\question_version_status; require_once(__DIR__ . '/../config.php'); require_once($CFG->libdir . '/questionlib.php'); @@ -42,36 +43,27 @@ $qtypes = question_bank::get_all_qtypes(); $pluginmanager = core_plugin_manager::instance(); // Get some data we will need - question counts and which types are needed. -$hiddenstatus = \core_question\local\bank\question_version_status::QUESTION_STATUS_HIDDEN; -$draftstatus = \core_question\local\bank\question_version_status::QUESTION_STATUS_DRAFT; +$counts = $DB->get_records_sql(" + SELECT q.qtype, + COUNT(qv.id) AS numquestions, + SUM(CASE WHEN qv.status = :hiddenstatus THEN 1 ELSE 0 END) AS numhidden, + SUM(CASE WHEN qv.status = :draftstatus THEN 1 ELSE 0 END) AS numdraft -$sql = "SELECT result.qtype, - SUM(result.numquestions) AS numquestions, - SUM(result.numhidden) AS numhidden, - SUM(result.numdraft) AS numdraft - FROM (SELECT data.qtype, - data.versionid, - COUNT(data.numquestions) AS numquestions, - (SELECT COUNT(qv.id) - FROM {question_versions} qv - WHERE qv.id = data.versionid - AND qv.status = :hiddenstatus) AS numhidden, - (SELECT COUNT(qv.id) - FROM {question_versions} qv - WHERE qv.id = data.versionid - AND qv.status = :draftstatus) AS numdraft - FROM (SELECT q.qtype, qv.id AS versionid, 1 AS numquestions - FROM {question} q - JOIN {question_versions} qv ON qv.questionid = q.id - JOIN {question_bank_entries} qbe ON qbe.id = qv.questionbankentryid - 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)) data - GROUP BY data.qtype, data.versionid) result - GROUP BY result.qtype"; + FROM {question_bank_entries} qbe + JOIN {question_versions} qv ON qv.questionbankentryid = qbe.id + AND qv.version = ( + SELECT MAX(version) + FROM {question_versions} + WHERE questionbankentryid = qbe.id + ) + JOIN {question} q ON q.id = qv.questionid + + GROUP BY q.qtype + ", [ + 'hiddenstatus' => question_version_status::QUESTION_STATUS_HIDDEN, + 'draftstatus' => question_version_status::QUESTION_STATUS_DRAFT, + ]); -$counts = $DB->get_records_sql($sql, ['hiddenstatus' => $hiddenstatus, 'draftstatus' => $draftstatus]); $needed = []; foreach ($qtypes as $qtypename => $qtype) { if (!isset($counts[$qtypename])) {