コースを完了していないユーザの抽出

コースを完了していないユーザの抽出

- hiroki nanba の投稿
返信数: 12

コースを未完了のユーザ一覧の抽出を、メールの送信のためと一覧表示のため行いたいです。


小テストの未受験者および不合格者を抽出するSQL文を書くことはできたのですが、

コースの未完了者(該当ユーザのコース概要でコースの進捗が100%と表示されないユーザ)

を抽出するSQLもしくは参照テーブルなどを教えていただけないでしょうか。


mdl_course_completionsテーブルのtimecompleted列に

コースの完了状態が記録されているかと思ったのですが、

timecompleted列の値がすべてNULLになっておりました。

(コースを完了しているユーザのuseridで確認してもNULLになっております)


現在使用しているmoodleのバージョンは3.5.1です。

何卒よろしくお願いいたします。

hiroki nanba への返信

Re: コースを完了していないユーザの抽出

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators

Rick Jerz先生による下記投稿のSQLが参考になるかと思います。

[Moodle in English: Moodle SQL Report: Display Students Who have not Completed a Course]
https://moodle.org/mod/forum/discuss.php?d=377802#p1532024

Mitsuhiro Yoshida への返信

Re: コースを完了していないユーザの抽出

- hiroki nanba の投稿

お答え頂きありがとうございます。

URLを参照したのですが、思ったように動きません。


SELECT DISTINCT c.shortname AS CourseName,

                u.firstname AS FirstName,

                u.lastname AS LastName,

                u.email AS Email,

                gg.finalgrade AS FinalGrade,

                c.idnumber AS CourseIDNum,

                gi.courseid AS CourseNumber,

                gg.userid AS StudentID,

                3 AS moodleversion

FROM mdl_grade_items gi

JOIN mdl_grade_grades gg ON gi.id = gg.itemid

JOIN mdl_course c ON c.id = gi.courseid

JOIN mdl_user u ON u.id = gg.userid

JOIN mdl_context ct ON ct.instanceid = gi.courseid

JOIN mdl_role_assignments ra ON ra.userid = gg.userid

JOIN mdl_user_enrolments ue ON u.id = ue.userid

JOIN mdl_enrol e ON e.courseid = gi.courseid

WHERE gi.itemtype = "course"

  AND gg.finalgrade IS  NULL

  AND u.suspended = 0

  AND u.deleted = 0

  AND ct.contextlevel = 50

  AND ra.roleid = 5

  AND ct.id = ra.contextid

  AND ue.status = 0

  AND e.status = 0

  AND e.id = ue.enrolid

  AND gi,courseid = 9

ORDER BY c.idnumber DESC,

         u.lastname,

         u.firstname


上記のSQL文を発行しても、結果が0件になってしまいました。

(コースのidは9で、1人のユーザをコースに登録、未受験の状態なので1件返ってきてほしいです)


今回コースにはテストを設けず、評点が存在しないコースで

コースを完了していないユーザの一覧を取得したいのですが、

finalgrade IS  NULLでは誤っているのでしょうか。

hiroki nanba への返信

Re: コースを完了していないユーザの抽出

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators

もう少し綺麗に記述する必要があると思いますが、下記SQLではいかがでしょうか。

SELECT DISTINCT c.shortname AS CourseName,
                u.id AS UserID,
                u.username AS UserName,
                u.firstname AS FirstName,
                u.lastname AS LastName,
                u.email AS Email
FROM mdl_user u
JOIN mdl_user_enrolments ue ON ue.userid=u.id
JOIN mdl_enrol e ON e.id = ue.enrolid
JOIN mdl_role_assignments ra ON ra.userid=u.id
JOIN mdl_context ct ON ct.id = ra.contextid
AND ct.contextlevel = 50
JOIN mdl_course c ON c.id = ct.instanceid
AND e.courseid = c.id
JOIN mdl_role r ON r.id = ra.roleid
AND r.shortname =  'student'
WHERE e.status = 0
AND u.suspended = 0
AND u.deleted = 0
AND NOT EXISTS (select * from mdl_course_completion_crit_compl WHERE userid = u.id)
AND c.id=9
ORDER BY u.id ASC

Mitsuhiro Yoshida への返信

Re: コースを完了していないユーザの抽出

- hiroki nanba の投稿

SQLを提示いただき誠にありがとうございます。

こちらのSQLで1件の該当ユーザが出てきました。


ですが、すみません、別のコースをすでに始めていて、コースを完了しているユーザもいるのですが

mdl_course_completion_crit_compl テーブルにデータ自体が1件も存在しませんでした。

コースを完了していればテーブルにデータが存在しているはずなのでしょうか。

hiroki nanba への返信

Re: コースを完了していないユーザの抽出

- hiroki nanba の投稿

mdl_course_modules_completionテーブルのcomplestateを見ればよいのではないかと思ったのですが、

coursemoduleidがどこに紐づいているのかわかりません。

こちらの認識は間違っているのでしょうか、

またcoursemoduleidはどこのテーブルを参照すればよいのでしょうか。

hiroki nanba への返信

Re: コースを完了していないユーザの抽出

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators

>またcoursemoduleidはどこのテーブルを参照すればよいのでしょうか。

下記のようにlib/moodlelib.phpの5068行目ではテーブル「mdl_course_modules」のカラム「id」を参照しています。

    // Delete completion defaults.
    $DB->delete_records("course_completion_defaults", array("course" => $courseid));

    // Remove all data from availability and completion tables that is associated
    // with course-modules belonging to this course. Note this is done even if the
    // features are not enabled now, in case they were enabled previously.
    $DB->delete_records_select('course_modules_completion',
           'coursemoduleid IN (SELECT id from {course_modules} WHERE course=?)',
           array($courseid));
hiroki nanba への返信

Re: コースを完了していないユーザの抽出

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators

> コースを完了していればテーブルにデータが存在しているはずなのでしょうか。

そう思います。

Mitsuhiro Yoshida への返信

Re: コースを完了していないユーザの抽出

- hiroki nanba の投稿

回答いただきありがとうございます。

コース完了していたらmdl_course_completion_crit_compl テーブルに

その旨のデータ存在するんですね。

どうして存在しないのかよくわからないですね。


coursemoduleidはmdl_course_modulesのidを参照していたんですね。

教えていただきありがとうございます。

mdl_course_modules_completionテーブルの該当するコースの全coursemoduleidのものの、

complestateが1、2、3の状態のユーザを取ってくるように記述して解決しました。

いろいろ教えていただき本当にありがとうございました。

hiroki nanba への返信

Re: コースを完了していないユーザの抽出

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators

> どうして存在しないのかよくわからないですね。

念のため、Moodle cron (例 /var/www/html/admin/cli/cron.php) が定期的 (例 5分毎) に動作しているかどうかご確認ください。

Mitsuhiro Yoshida への返信

Re: コースを完了していないユーザの抽出

- hiroki nanba の投稿

下記を記述したbatファイルを作成し、

タスクスケジューラで5分毎に実行させているのですが実行されているようでした。


c:\xampp\php\php-win.exe -f c:\xampp\htdocs\moodle\admin\cli\cron.php  > c:\xampp\htdocs\moodle\admin\cron.log 2>&1


こちらの設定で間違えないでしょうか。

このような状態はcronの不実行が原因なのでしょうか。

hiroki nanba への返信

Re: コースを完了していないユーザの抽出

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators

> こちらの設定で間違えないでしょうか。

設定は間違っていないと思います。

> このような状態はcronの不実行が原因なのでしょうか。

cronが定期的に実行されていない場合、mdl_course_completion_crit_complにコース完了のレコードが追加されないようです。

もし可能でしたら、実運用サイトに近い環境でも同じような現象が発生するかご確認頂けませんでしょうか。

Mitsuhiro Yoshida への返信

Re: コースを完了していないユーザの抽出

- hiroki nanba の投稿

返信遅くなってしまい申し訳ございません。

違う環境でも試してみましたが、同じようにmdl_course_completion_crit_complテーブルにデータが入っていませんでした。moodleの設定やcronの設定なども同じように設定しているので、それで同じ結果になってしまったかもしれません。