phpmyadmin

phpmyadmin

- 良太 浅井 の投稿
返信数: 9

立て続けの質問で申し訳ありません。


Moodle packages for Windows からMoodle2.9.3+をインストールしました。

OSはWindowsServer2008R2を使用しています。

--------------------------------------------------------------------------------------------------------

Moodleのデータをphpmyadminから取得したいのですが、phpmyadminのインストール方法が分かりません。


コースごとの受講者名を一括で取得して、CSVファイルなどで出力する機能が欲しいです。


自分の推測

カテゴリやコース名、登録している生徒名などは全てMySQLでデータベースに保管されているので、

phpmyadminを開ければ、SQL構文を使ってデータの抽出ができるのではないかと考えました。

また、phpmyadminが開ければ、データベース名やテーブル名が分かるので、phpからレコードの抽出なども可能ではないかと

思っています。



フロントページにアクセスするURLが

http://XXXXXXXX:8080    なので、

http://XXXXXXXX:8080/phpmyadmin    とすればphpmyadminが開くかと思ったのですが、開かず。

そもそも、serverフォルダ内にphpmyadminフォルダが無いように思います。



勝手ながら、教えていただきたいことが2つあり、

①phpmyadminの設定方法について情報をいただけると助かります。

②そもそもデータの抽出方法としてphpmyadminを使うことが正しいのでしょうか?




良太 浅井 への返信

Re: phpmyadmin

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

実際にデータを抽出することが不可能ではないため、「データの抽出方法としてphpmyadminを使うこと」は間違ってはいないと思います。

「phpmyadminの設定方法」に関しましては、ご参考までに下記ページをご覧ください。

[phpMyAdminインストール - phpMyAdminの使い方 DBOnline IT技術全般の学習サイト]
http://www.dbonline.jp/phpmyadmin/install/

受講者名に関しましては、サイト管理者または教師として各コースに入って、「管理 > 評定」ページでプルダウンメニューから「エクスポート > Excelスプレッドシート」を選択することにより、コースごとに取得することはできます。

「コースごとの受講者名を一括で取得して、CSVファイルなどで出力する」ことになりますと、そのような機能を新たに開発してMoodleに追加するか、SQL文を書いて下記ページのような形でCSVファイルを取得することになるかと思います。

[MySQLのSELECT文でcsvを出力する - Qiita]
http://qiita.com/catatsuy/items/9fdf4423d5f4885b9bf9

Mitsuhiro Yoshida への返信

Re: phpmyadmin

- 良太 浅井 の投稿

Yoshida様

いつもありがとうございます。


まず、ご教授いただいたサイトを参考に、phpmyadminをインストールすることができました。

ログインも確認し、SQL文も入力できるようになりました。

また、こちらもご教授いただいたとおり、moodleの機能でコースごとに受講者情報のExcelシートをエクスポートできました。


現在は、登録コースが圧倒的に少ないので、当分はmoodleの機能で受講者情報のExcelシートをエクスポートする方法で

管理しようと思います。


おいおい、全コースの受講者を一元管理する機能も検討したいと思います。

やりたいことはできるようになりました。 ありがとうございました。


良太 浅井 への返信

Re: phpmyadmin

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators
ご希望に添えるか分かりませんが、恐らく、下記SQL文でコースごとのユーザを取得できるかと思います。

SELECT TBLCOURSE.fullname, TBLCOURSE.shortname, TBLENROL.enrol, TBLUSER.username, TBLROLE.shortname, TBLUSER.lastname, TBLUSER.firstname, TBLUSER.email
FROM mdl_course TBLCOURSE
INNER JOIN mdl_enrol TBLENROL ON ( TBLCOURSE.id = TBLENROL.courseid )
INNER JOIN mdl_user_enrolments TBLUSERENROL ON ( TBLENROL.id = TBLUSERENROL.enrolid )
INNER JOIN mdl_user TBLUSER ON ( TBLUSERENROL.userid = TBLUSER.id )
INNER JOIN mdl_role_assignments TBLROLEASSIGN ON ( TBLUSER.id = TBLROLEASSIGN.userid )
INNER JOIN mdl_role TBLROLE ON ( TBLROLEASSIGN.roleid = TBLROLE.id )
ORDER BY TBLCOURSE.shortname, TBLUSER.username;

Mitsuhiro Yoshida への返信

Re: phpmyadmin

- 良太 浅井 の投稿

Yoshida様


いつも本当にありがとうございます。

インストールしたphpMyAdminにログイン後、moodleデータベースを選択して、

教えていただいたコードを実行(純粋にコピペしてSQL文として実行)したら、

全コースと全受講生の一覧を取得できました!


その後、phpMyAdminの機能でCSV形式でエクスポートもできました。

後はVisualBasicでデータ形式を整えれば、理想的な状態に持っていけそうです!


感謝してもしきれないです。本当にありがとうございます。


良太 浅井 への返信

Re: phpmyadmin

- M Numata の投稿

先般質問をさせていただいている者と同じ環境におります。よろしくお願いいたします。
Moodle2.9.3+、OSはWindowsServer2008R2を使用しています。

---------------------------------------------------------------------------------

phpmyadminから受講者についての情報を取り出したく、このスレッドでYoshidaさまが記述されていたSQL構文を元に試しているのですが、欲しい結果を得られずにおります。

膨大なテーブルとフィールドの関連性で混乱しているうえSQLも超初心者のため戸惑っております。テーブル、フィールドの仕様について情報を探していますが、見つけられませんでした。フィールドの関連付けについてアドバイスいただければ幸いです


取り出したい情報:一定期間に購入した受講者の情報(受講者、購入コース、購入日時、そのコースで割り当てられたロール)

試したSQL構文:

SELECT TBLCOURSE.idnumber, TBLUSER.username, TBLUSERENROLMENT.timecreated,TBLCOURSE.shortname, TBLROLEASSIGN.roleid, TBLUSER.lastname, TBLUSER.firstname, TBLUSER.email,  TBLUSERENROLMENT.userid 

FROM mdl_user_enrolments as TBLUSERENROLMENT 

INNER JOIN mdl_user as TBLUSER ON ( TBLUSERENROLMENT.userid = TBLUSER.id ) 

INNER JOIN mdl_enrol as TBLENROL ON ( TBLUSERENROLMENT.enrolid = TBLENROL.id ) 

INNER JOIN mdl_course as TBLCOURSE ON (TBLENROL.courseid = TBLCOURSE.id) 

INNER JOIN mdl_context as TBLCONTEXT  ON (TBLCOURSE.id = TBLCONTEXT.instanceid) 

INNER JOIN mdl_role_assignments as TBLROLEASSIGN ON (TBLCONTEXT.contextlevel = '50' AND TBLCONTEXT.id = TBLROLEASSIGN.contextid)

WHERE from_unixtime(TBLUSERENROLMENT.timecreated) BETWEEN '2016-09-01' AND '2016-09-27'

結果が、同じ受講者/コースの購入データが重複して抽出されてしまいます。(画像添付します)

M Numata への返信

Re: phpmyadmin

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

SELECT句にDISTINCTオプションを付加した下記SQL文をお試しください。

SELECT DISTINCT TBLCOURSE.idnumber, TBLUSER.username, TBLUSERENROLMENT.timecreated,TBLCOURSE.shortname, TBLROLEASSIGN.roleid, TBLUSER.lastname, TBLUSER.firstname, TBLUSER.email,  TBLUSERENROLMENT.userid
FROM mdl_user_enrolments as TBLUSERENROLMENT
INNER JOIN mdl_user as TBLUSER ON ( TBLUSERENROLMENT.userid = TBLUSER.id )
INNER JOIN mdl_enrol as TBLENROL ON ( TBLUSERENROLMENT.enrolid = TBLENROL.id )
INNER JOIN mdl_course as TBLCOURSE ON (TBLENROL.courseid = TBLCOURSE.id)
INNER JOIN mdl_context as TBLCONTEXT  ON (TBLCONTEXT.contextlevel = '50' AND TBLCOURSE.id = TBLCONTEXT.instanceid)
INNER JOIN mdl_role_assignments as TBLROLEASSIGN ON (TBLCONTEXT.id = TBLROLEASSIGN.contextid)
WHERE from_unixtime(TBLUSERENROLMENT.timecreated) BETWEEN '2016-09-01' AND '2016-09-27'

Mitsuhiro Yoshida への返信

Re: phpmyadmin

- M Numata の投稿

Yoshida様

早速のご教示ありがとうございます、勉強不足で初歩的な質問で申し訳ありません。

DISTINCTで重複データがまとめられました。


もう一つ、教えていただけますでしょうか。


コースに紐付いているロール の情報だけを取得しようとしています。

コースで割り当てているロールはほとんどが"5"の学生です。

ところが上記構文で得られる結果ではほとんどのユーザに、TBLROLEASSIGN.roleidに"4"と"5"の2つ分、書き出されてしまいます。

TBLROLEASSIGN.roleidの値として"4"が何を示しているのかがわかりません。コースに対するロールではなく、別のコンテクスト(モジュール?)のロールを示すのでしょうか。

コースの受講登録済みユーザのロール情報を正確に取得したいです。


M Numata への返信

Re: phpmyadmin

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

「4」は「教師 (teacher)」です。

Mitsuhiro Yoshida への返信

Re: phpmyadmin

- M Numata の投稿

Yoshidaさま


御礼が遅れてしまい申し訳ありません。

元々のSQLの検索条件が足りていなくて、複数のロールが返されてしまう状態でした。確認しなおして、希望していた結果が得られました。

SQLのテーブルをうまく使えればデータ取得も容易になりそうなのでしっかり勉強したいと思います

ありがとうございました。


以下備忘録として(長々すみません)

取得するデータ: 購入者、購入日時、コースid等

取得条件: 指定日内、購入したコースのロールが"5 学生"のもの

SELECT TBLCOURSE.idnumber, TBLUSER.username, TBLUSERENROLMENT.timecreated,TBLCOURSE.shortname, TBLROLEASSIGN.roleid, TBLUSER.lastname, TBLUSER.firstname, TBLUSER.email,  TBLUSERENROLMENT.userid 

FROM mdl_user_enrolments as TBLUSERENROLMENT 

INNER JOIN mdl_user as TBLUSER ON ( TBLUSERENROLMENT.userid = TBLUSER.id ) 

INNER JOIN mdl_enrol as TBLENROL ON ( TBLUSERENROLMENT.enrolid = TBLENROL.id ) 

INNER JOIN mdl_course as TBLCOURSE ON (TBLENROL.courseid = TBLCOURSE.id) 

INNER JOIN mdl_context as TBLCONTEXT  ON (TBLCONTEXT.contextlevel = '50' AND TBLCOURSE.id = TBLCONTEXT.instanceid) 

INNER JOIN mdl_role_assignments as TBLROLEASSIGN ON (TBLUSER.id=TBLROLEASSIGN.userid AND TBLCONTEXT.id = TBLROLEASSIGN.contextid) 

WHERE from_unixtime(TBLUSERENROLMENT.timecreated) BETWEEN "2016-09-20" AND "2016-09-30 23:59:59"

AND TBLROLEASSIGN.roleid = '5' 

ORDER BY TBLUSERENROLMENT.timecreated DESC