Как узнать общее количество вопросов в курсе?

Re: Как узнать общее количество вопросов в курсе?

от Alexandre Scherbyna -
Количество ответов: 13
Вот похоже на то, что вы хотите: https://docs.moodle.org/31/en/ad-hoc_contributed_reports#Number_of_Quizes_per_Course
Но вообще-то вам надо научиться самому писать подобные запросы для Configurable Reports.
В ответ на Alexandre Scherbyna

Re: Как узнать общее количество вопросов в курсе?

от Vadim Tabunshchik -
Изображение пользователя Developers

Александр, это запрос для определения количества тестов в курсе.

С вопросами всё немного сложнее.

Алексей, пишите запрос к БД и используйте что-нить попроще, чем block_configurable_reports, например, Ad-hoc database queries

Я тут набросал запрос для подсчета общего кол-ва вопросов в курсе, включая банки тестов, можете "допиливать"

SELECT (
    SELECT COUNT(q.id)
    FROM mdl_question q
    WHERE q.category IN (
        SELECT qc.id FROM mdl_question_categories qc WHERE qc.contextid = (
                SELECT ctx.id FROM mdl_context ctx WHERE ctx.instanceid = '351'
                )
        )) + (
    SELECT COUNT(q.id)
    FROM mdl_question q
    WHERE q.category IN (
        SELECT qc.id FROM mdl_question_categories qc WHERE qc.contextid IN (
                SELECT ctx.id FROM mdl_context ctx WHERE ctx.instanceid IN (
                        SELECT cm.id FROM mdl_course_modules cm WHERE cm.module = (
                                    SELECT m.id FROM mdl_modules m WHERE m.name = 'quiz'
                                    ) AND cm.course = '351'
                        )
                )
    )
) 'Всего вопросов'

Вместо числа 351 нужно подставить ID своего курса.

Если будете использовать Ad-hoc database queries, запрос нужно отредактировать:

SELECT (
    SELECT COUNT(q.id)
    FROM {question} q
    WHERE q.category IN (
        SELECT qc.id FROM {question_categories} qc WHERE qc.contextid = (
                SELECT ctx.id FROM {context} ctx WHERE ctx.instanceid = :instanceid
                )
        )) + (
    SELECT COUNT(q.id)
    FROM {question} q
    WHERE q.category IN (
        SELECT qc.id FROM {question_categories} qc WHERE qc.contextid IN (
                SELECT ctx.id FROM {context} ctx WHERE ctx.instanceid IN (
                        SELECT cm.id FROM {course_modules} cm WHERE cm.module = (
                                    SELECT m.id FROM {modules} m WHERE m.name = 'quiz'
                                    ) AND cm.course =:course
                        )
                )
        )
) 'Всего вопросов'

Запрос будет иметь два поля для ввода ID курса:

ris

В оба вводите один и тот же ID курса, получаете общее кол-во вопросов:

ris1

ЗЫ: не проще все вопросы из банка тестов поднять в категории банка курса?

В ответ на Vadim Tabunshchik

Re: Как узнать общее количество вопросов в курсе?

от Alexey Piguzov -
Огромное спасибо за подсказки! Будем пробовать!
ЗЫ: не проще все вопросы из банка тестов поднять в категории банка курса?
Конечно проще, я бы так и сделал, но система не моя, нужно провести небольшой аудит, а когда курсов десятков несколько, уже нужна автоматизация.
Спасибо еще раз!
В ответ на Vadim Tabunshchik

Re: Как узнать общее количество вопросов в курсе?

от Alexey Piguzov -
Воспользовался вторым способом, плагин поставил, но
выдает Ошибка чтения базы, буду разбираться.
В ответ на Alexey Piguzov

Re: Как узнать общее количество вопросов в курсе?

от Vadim Tabunshchik -
Изображение пользователя Developers
выдает Ошибка чтения базы, буду разбираться.

Ага, мой косяк. Подзапрос SELECT ctx.id FROM mdl_context ctx WHERE ctx.instanceid = '351' может выдавать несколько строк для разных contextlevel, поэтому нужно уточнить, что нам нужен только уровень курса, добавив условие AND ctx.contextlevel = '50'

В итоге получим:

SELECT (
    SELECT COUNT(*)
    FROM {question} q
    WHERE q.category IN (
        SELECT qc.id FROM {question_categories} qc WHERE qc.contextid = (
                SELECT ctx.id FROM {context} ctx WHERE ctx.instanceid = :instanceid
                                AND ctx.contextlevel = '50'
                )
        )) + (
    SELECT COUNT(*)
    FROM {question} q
    WHERE q.category IN (
        SELECT qc.id FROM {question_categories} qc WHERE qc.contextid IN (
                SELECT ctx.id FROM {context} ctx WHERE ctx.instanceid IN (
                        SELECT cm.id FROM {course_modules} cm WHERE cm.module = (
                                    SELECT m.id FROM {modules} m WHERE m.name = 'quiz'
                                    ) AND cm.course =:course
                        )
                )
        )
) 'Всего вопросов'
В ответ на Vadim Tabunshchik

Re: Как узнать общее количество вопросов в курсе?

от Vadim Tabunshchik -
Изображение пользователя Developers

И ещё пара уточнений:

  1. нужно исключить случайные (random) вопросы из общего кол-ва, т .к. они создаются из уже существующих вопросов различных типов
  2. вопросы типа cloze содержат две строки в таблице вопросов с qtype=multichoice, поэтому получается несоответствие кол-ва вопросов, полученных запросом из БД и посчитанных вручную в курсе.
SELECT (
    SELECT COUNT(q.id)
    FROM {question} q
    WHERE q.category IN (
        SELECT qc.id FROM {question_categories} qc WHERE qc.contextid = (
                SELECT ctx.id FROM {context} ctx WHERE ctx.instanceid =:instanceid
                                AND ctx.contextlevel = '50'
                )
        ) AND q.qtype <> 'random' AND q.parent = '0') + (
    SELECT COUNT(q.id)
    FROM {question} q
    WHERE q.category IN (
        SELECT qc.id FROM {question_categories} qc WHERE qc.contextid IN (
                SELECT ctx.id FROM {context} ctx WHERE ctx.instanceid IN (
                        SELECT cm.id FROM {course_modules} cm WHERE cm.module = (
                                    SELECT m.id FROM {modules} m WHERE m.name = 'quiz'
                                    ) AND cm.course =:course
                        )
                )
    )  AND q.qtype <> 'random' AND q.parent = '0'
) 'Всего вопросов'
В ответ на Vadim Tabunshchik

Re: Как узнать общее количество вопросов в курсе?

от Alexey Piguzov -
Спасибо, Вадим!
Отлично работает! То что надо!
В ответ на Alexey Piguzov

Re: Как узнать общее количество вопросов в курсе?

от Alexandre Scherbyna -

Но только пользоваться этим отчетом не очень удобно. Нужно вводить ID курса один за другим.

Мне нравится вот этот отчет. Там по каждой кафедре выводится табличка с перечнем курсов. Против каждого курса выводится фамилия его преподавателя, а за ней информация о том, чего и сколько в этом курсе есть: сколько файлов, сколько тестов и т.п. Вот если бы в этот отчет добавить колонку, сколько тестовых вопросов имеется в этом курсе, то такой отчет был бы мечтой всех администраторов. улыбаюсь

В ответ на Alexandre Scherbyna

Re: Как узнать общее количество вопросов в курсе?

от Vadim Tabunshchik -
Изображение пользователя Developers

Количество вопросов в банке курса:

SELECT
concat('<a target="_blank" href="%%WWWROOT%%/question/edit.php',CHAR(63),'courseid=',c.id,'">',c.fullname,'</a>') 'Курс',
Count(q.id) 'Вопросов'
FROM
{question} q
INNER JOIN {question_categories} qc ON qc.id = q.category AND q.qtype <> 'random' AND q.parent = 0
INNER JOIN {context} ctx ON ctx.id = qc.contextid
INNER JOIN {course} c ON c.id = ctx.instanceid AND ctx.contextlevel = 50
GROUP BY
c.id
ORDER BY
c.fullname

Количество вопросов в банках отдельных тестов

SELECT
CONCAT('<a target="_blank" href="%%WWWROOT%%/course/view.php',CHAR(63),'id=',c.id,'">',c.fullname,'</a>') 'Курс'
,CONCAT('<a target="_blank" href="%%WWWROOT%%/question/edit.php',CHAR(63),'cmid=',cm.id,'',CHAR(38),'category=',qc.id,'',CHAR(44),'',qc.contextid,'">',qc.name,'</a>') 'Категория'
,COUNT(q.id) 'Вопросов в банке теста'
FROM
{question} q
INNER JOIN {question_categories} qc ON q.category = qc.id AND q.qtype <> 'random' AND q.parent = '0'
INNER JOIN {context} ctx ON qc.contextid = ctx.id AND ctx.contextlevel = '70'
INNER JOIN {course_modules} cm ON ctx.instanceid = cm.id AND cm.module = (SELECT m.id FROM {modules} m WHERE m.name='quiz')
INNER JOIN {course} c ON c.id = cm.course
GROUP BY
qc.id
ORDER BY
c.fullname, qc.id
В ответ на Vadim Tabunshchik

Re: Как узнать общее количество вопросов в курсе?

от Alexandre Scherbyna -

Спасибо, Вадим!

У меня первый отчет работает:

���� ��������
Курс №1 3
Основи веб-програмування та дизайну. HTML+CSS 1
Управління проектами 66

Хотя кириллицу почему-то не воспроизводит, а второй отчет дает ошибку. Видимо из-за того, что вопросов в банках отдельных тестов на этом сайте нет. А в один отчет суммарное количество вопросов во всех банках курса нельзя вывести?

Error when executing the query: Помилка читання бази даних You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 0, 2' at line 13 SELECT CONCAT('',c.fullname,'') 'Курс' ,CONCAT('',qc.name,'') 'Категория' ,COUNT(q.id) 'Вопросов в банке теста' FROM mdl_question q INNER JOIN mdl_question_categories qc ON q.category = qc.id AND q.qtype <> 'random' AND q.parent = '0' INNER JOIN mdl_context ctx ON qc.contextid = ctx.id AND ctx.contextlevel = '70' INNER JOIN mdl_course_modules cm ON ctx.instanceid = cm.id AND cm.module = (SELECT m.id FROM mdl_modules m WHERE m.name='quiz') INNER JOIN mdl_course c ON c.id = cm.course GROUP BY qc.id ORDER BY LIMIT 0, 2 [array ( )]

В ответ на Alexandre Scherbyna

Re: Как узнать общее количество вопросов в курсе?

от Vadim Tabunshchik -
Изображение пользователя Developers
Хотя кириллицу почему-то не воспроизводит

Может при копировании-вставке сменилась кодировка. Нужно запрос в блокноте сохранить в кодировке UTF-8, потом попробовать вставить в окно SQL-запроса.

второй отчет дает ошибку. Видимо из-за того, что вопросов в банках отдельных тестов на этом сайте нет.

Ошибки не должно быть. Если вопросов в банках тестов нет, результат пустой будет и всё. Нужно проверить, почему ругается на syntax to use near 'LIMIT 0, 2'. Такого в моем запросе нет.

ris

А в один отчет суммарное количество вопросов во всех банках курса нельзя вывести?

Можно, уже написал запрос с выводом 3-х колонок - вопросы в банке курса, вопросы в банках тестов, сумма вопросов. Но это для любителей "извращений" улыбаюсь Запрос прикрепил файлом.

ris

В ответ на Vadim Tabunshchik

Re: Как узнать общее количество вопросов в курсе?

от Alexandre Scherbyna -

Спасибо, Вадим!

Действительно, что-то лишнее добавилось при копировании.

Сейчас все работает, кроме кириллицы. Копирую и напрямую из этого форума, где странички в UTF-8, и через другой редактор:


Пробовал разные версии Ad-hoc database queries: и для 2.9, и для 3.1. Все равно в заголовках кириллицы нет нигде. в думах

В ответ на Alexandre Scherbyna

Re: Как узнать общее количество вопросов в курсе?

от Vadim Tabunshchik -
Изображение пользователя Developers
Сейчас все работает, кроме кириллицы.

Да, проблема есть, но только под Windows. Некорректно работает функция fgetcsv

Эта функция принимает во внимание настройки локали, а в Винде с этим проблема.

Пока единственный вариант - использовать латиницу в названиях колонок.

В ответ на Vadim Tabunshchik

Re: Как узнать общее количество вопросов в курсе?

от Alexandre Scherbyna -

Спасибо! Это хорошая новость. У меня все рабочие сайты на Linux. Я проверил. Там, действительно, все правильно работает.