2012-04-03 29 views
2

こんにちは私はスタックして新しくて、私と一緒に裸にしてください。基本的に私は、彼らはに登録されている関連コースの生徒と教師によって行われた最新のフォーラムの投稿を照会するMoodleのデータベースを使用しています複数の検索結果が表示されますか?

ここに私が参加し、彼らが保持するもので説明する必要があるテーブルは以下の通りです。

mdl_forum_postsは=、システムのすべてのユーザーの
mdl_log =「活動
mdl_user =「ユーザーについて格納されている情報は、」それも
mdl_forum_discussionsは=「フォーラムは、議論のように構成されている」「すべての記事は、このテーブルに格納されています」ログインして投稿を追加する "
ここではmdl_user_enrolments = "コースに参加するユーザーが"
mdl_enrol = "mdl_courseで使用される登録プラグインのインスタンス"
mdl_course = "システムで利用可能なコース"

は私のクエリです:

SELECT l.time AS TimeofPost, l.action as Action, usr.id as UserID, 
     usr.firstname,usr.lastname, c.id as CourseID , c.fullname, 
     c.idnumber, fd.name, fd.timemodified as CreatedOn, fp.created, 
     fp.modified, fp.subject, fp.message 

FROM mdl_forum_posts fp 

LEFT JOIN mdl_forum_discussions fd ON fp.discussion = fd.id 
LEFT JOIN mdl_user usr ON fp.userid = usr.id 
LEFT JOIN mdl_log l ON usr.id = l.userid 
LEFT JOIN mdl_user_enrolments ue ON usr.id = ue.userid 
LEFT JOIN mdl_enrol e ON ue.enrolid = e.id 
LEFT JOIN mdl_course c ON e.courseid = c.id 

WHERE (action = 'add post' OR action = 'add discussion')  

私が持っている問題は、私は重複した結果を得ているということです。これは非常に感謝されるように誰もが任意のアドバイスを得た?

乾杯

アントン

+0

サンプルデータも表示する必要があります。このような多くのJOINを使用すると、簡単にダストを取得できます。 – JNK

+0

質問にテーブル構造を追加できますか? –

+0

どのmoodleのバージョンを使用していますか? – iankit

答えて

1

ログテーブルを使用する必要はありません。投稿が追加され、タイムスタンプがあることだけで十分です。また、null値を期待しないかぎり、LEFT JOINを実際に使用する必要はありません。私は登録テーブルへのリンクに残っていますので、学生の登録が取り消された場合には表示されませんが、これは本当に必要ではありません。

フォーラムの投稿ごとに複数の一致があるため、重複しています。登録テーブルには、各コースのインスタンスが多数あります。このクエリでは、あるものが存在する場所だけを取得することができます。

SELECT fp.id, 
      usr.id as UserID, 
      usr.firstname, 
      usr.lastname, 
      c.id as CourseID, 
      c.fullname, 
      c.idnumber, 
      fd.name, 
      fd.timemodified as DiscussionCreatedOn, 
      fp.created AS TimeofPost, 
      fp.modified, 
      fp.subject, 
      fp.message 
     FROM mdl_forum_posts fp 
INNER JOIN mdl_forum_discussions fd ON fp.discussion = fd.id 
INNER JOIN mdl_forum f ON f.id = fd.forum 
INNER JOIN mdl_course c ON f.course = c.id 
INNER JOIN mdl_user usr ON fp.userid = usr.id 
    WHERE EXISTS (SELECT 1 
        FROM mdl_user_enrolments ue 
       INNER JOIN mdl_enrol e ON ue.enrolid = e.id 
        WHERE usr.id = ue.userid 
         AND e.courseid = f.course) 
0
SELECT DISTINCT l.time AS TimeofPost, l.action as Action, usr.id as UserID, usr.firstname,   usr.lastname, c.id as CourseID , c.fullname, c.idnumber, fd.name, fd.timemodified as CreatedOn, fp.created, fp.modified, fp.subject, fp.message 

"言葉" DISTINCTあなた

+0

こんにちは、すぐに私に戻ってくれてありがとう、残念ながら私はこれを試みたが、私はまだ同じ結果を得る:(。 – Moodlebook

2

を助けるかもしれないあなたは、現在のユーザーIDにmdl_logするmdl_forum_postsをリンクされています。

これは、特定のユーザーのログに記録されたすべてのアクションレコードが、特定の投稿を投稿アクションのログにリンクする代わりに、そのユーザーが行ったすべての投稿にリンクさせることを意味します。

関連する問題