2017-03-15 15 views
0

データベース上の既存のテーブル(特定のMoodle)からデータを選択するために、mySQLでクエリを作成しようとしています。このスキームは素晴らしいとは思えませんが、これは 'ratings'プラグインがインストールされたMoodleデータベースから来ました。3つのテーブル間のSQLクエリ - 結合しますか?

現在のデータ構造は次のようになります。

mdl_ranking_points

CREATE TABLE `mdl_ranking_points` (
    `id` bigint(10) NOT NULL AUTO_INCREMENT, 
    `userid` bigint(10) NOT NULL, 
    `courseid` bigint(10) NOT NULL, 
    `points` decimal(10,1) NOT NULL, 
    `timecreated` bigint(10) NOT NULL, 
    `timemodified` bigint(10) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='Points of users' 

mdl_ranking_points table

mdl_ranking_logs

CREATE TABLE `mdl_ranking_logs` (
     `id` bigint(10) NOT NULL AUTO_INCREMENT, 
     `rankingid` bigint(10) NOT NULL, 
     `courseid` bigint(10) NOT NULL, 
     `course_modules_completion` bigint(10) NOT NULL, 
     `points` decimal(10,1) NOT NULL, 
     `timecreated` bigint(10) NOT NULL, 
     PRIMARY KEY (`id`) 
    ) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8 COMMENT='Points of users' 

mdl_ranking_logs table

mdl_user私は、次のデータを使用してクエリを返す必要が

CREATE TABLE `mdl_user` (
     `id` bigint(10) NOT NULL AUTO_INCREMENT, 
     `auth` varchar(20) NOT NULL DEFAULT 'manual', 
     `confirmed` tinyint(1) NOT NULL DEFAULT '0', 
     `username` varchar(100) NOT NULL DEFAULT '', 
     `password` varchar(255) NOT NULL DEFAULT '', 
     `idnumber` varchar(255) NOT NULL DEFAULT '', 
     `firstname` varchar(100) NOT NULL DEFAULT '', 
     `lastname` varchar(100) NOT NULL DEFAULT '', 
     `email` varchar(100) NOT NULL DEFAULT '', 
     PRIMARY KEY (`id`), 
     UNIQUE KEY `mdl_user_mneuse_uix` (`mnethostid`,`username`), 
     KEY `mdl_user_fir_ix` (`firstname`), 
     KEY `mdl_user_las_ix` (`lastname`), 
     KEY `mdl_user_idn_ix` (`idnumber`), 
    ) ENGINE=InnoDB AUTO_INCREMENT=1045 DEFAULT CHARSET=utf8 COMMENT='One record for each person' 

mdl_course

CREATE TABLE `mdl_course` (
    `id` bigint(10) NOT NULL AUTO_INCREMENT, 
    `category` bigint(10) NOT NULL DEFAULT '0', 
    `sortorder` bigint(10) NOT NULL DEFAULT '0', 
    `fullname` varchar(254) NOT NULL DEFAULT '', 
    `shortname` varchar(255) NOT NULL DEFAULT '', 
    `idnumber` varchar(100) NOT NULL DEFAULT '', 
    `summary` longtext, 
    `summaryformat` tinyint(2) NOT NULL DEFAULT '0', 
    `format` varchar(21) NOT NULL DEFAULT 'topics', 
    `showgrades` tinyint(2) NOT NULL DEFAULT '1', 
    `newsitems` mediumint(5) NOT NULL DEFAULT '1', 
    `startdate` bigint(10) NOT NULL DEFAULT '0', 
    `enddate` bigint(10) NOT NULL DEFAULT '0', 
    `marker` bigint(10) NOT NULL DEFAULT '0', 
    `maxbytes` bigint(10) NOT NULL DEFAULT '0', 
    `legacyfiles` smallint(4) NOT NULL DEFAULT '0', 
    `showreports` smallint(4) NOT NULL DEFAULT '0', 
    `visible` tinyint(1) NOT NULL DEFAULT '1', 
    `visibleold` tinyint(1) NOT NULL DEFAULT '1', 
    `groupmode` smallint(4) NOT NULL DEFAULT '0', 
    `groupmodeforce` smallint(4) NOT NULL DEFAULT '0', 
    `defaultgroupingid` bigint(10) NOT NULL DEFAULT '0', 
    `lang` varchar(30) NOT NULL DEFAULT '', 
    `theme` varchar(50) NOT NULL DEFAULT '', 
    `timecreated` bigint(10) NOT NULL DEFAULT '0', 
    `timemodified` bigint(10) NOT NULL DEFAULT '0', 
    `requested` tinyint(1) NOT NULL DEFAULT '0', 
    `enablecompletion` tinyint(1) NOT NULL DEFAULT '0', 
    `completionnotify` tinyint(1) NOT NULL DEFAULT '0', 
    `cacherev` bigint(10) NOT NULL DEFAULT '0', 
    `calendartype` varchar(30) NOT NULL DEFAULT '', 
    PRIMARY KEY (`id`), 
    KEY `mdl_cour_cat_ix` (`category`), 
    KEY `mdl_cour_idn_ix` (`idnumber`), 
    KEY `mdl_cour_sho_ix` (`shortname`), 
    KEY `mdl_cour_sor_ix` (`sortorder`) 
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COMMENT='Central course table'; 

姓|ポイント|平均

私は、次のクエリを試してみたが、これは、私は(唯一のポイントを授与されているユーザーIDをカウントしているようです。

SELECT lastname AS academy, 
    SUM(points) AS score, 
    COUNT(*) AS users, 
    (SUM(points)/COUNT(*)) AS norm 
FROM mdl_ranking_points r 
LEFT JOIN mdl_user ON r.userid = mdl_user.id 
LEFT JOIN mdl_course ON r.courseid = mdl_course.id 
GROUP BY lastname 
ORDER BY norm DESC 

すべてのヘルプははるかに高く評価されるだろう必要なものを返すdoes notの。私は、この完全に間違った方向に近づくことができる。

+0

mdl_courseのSHOW CREATE TABLEを提供できますか? –

+0

@DanIonescu私は説明に追加しました。 Thanks –

+0

おかげさまで、いくつかのサンプルSQLを持つ外部ダウンロードリンクを追加してテーブルにデータを取り込むことができれば便利です。私のテストmysqlで手動でそれらを設定しようとすると、多くの時間がかかるでしょう。 –

答えて

1
I've tried the following query, but this doesnt return what I need (it seems that it only counts user id's that have been awarded points. 

をこれは、彼らはいくつかのポイント

01報われていない場合でも。これは、すべてのユーザーが返されます加入中程度であり、

または、右外部結合でクエリを変更します。

+0

ありがとうございます。しかし、mdl_ranking_pointsにはどのフィールドが参加するのですか?mdl_ranking_logsテーブルを「通過」します。 はスコアとして、アカデミーAS SUM(ポイントを) 姓を選択、 COUNT(*)mdl_user FROM規範 ASユーザー、 (SUM(ポイント)/ COUNT(*))AS:私は実行しているときに次のエラーを取得しますU LEFT OUTERはノルムDESC BY LASTNAME ORDER BY不明カラムmdl_user.id = mdl_ranking_points.userid LEFT OUTER JOIN mdl_course ON r.courseid = mdl_course.id グループはフィールド」で 'mdl_user.id' にmdl_ranking_pointsをJOIN リスト ' –

+0

'フィールドリスト 'の'不明な列 'mdl_user.id'は、エイリアスを作成したためですテーブルmdl_userに追加する必要があります。そのため、テーブル名ではなく、それ以上の結合でuを使用する必要があります。 – Kevin

関連する問題