2012-04-03 46 views
2

嗨,我新來堆棧,請裸露在我身邊。 。基本上,我使用Moodle的數據庫來查詢學生和教師所做的最新的論壇帖子的相關課程,他們在招收我的查詢有多個結果?

這裏有我需要加入表和他們持什麼樣的解釋:

mdl_forum_posts =「所有帖子都存儲在該表中」
mdl_forum_discussions =「論壇是由作爲討論」
mdl_user =「信息存儲有關用戶」
mdl_log =「系統的每個用戶的活動吧,登錄 - 添加帖子「
個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's,它很容易得到愚蠢。 – JNK 2012-04-03 13:45:43

+0

你可以添加你的表結構的問題? – 2012-04-03 13:48:34

+0

你正在使用哪種moodle版本? – iankit 2014-01-26 16:16:49

回答

1

不需要使用日誌表 - 事實上已添加帖子並且有時間戳是您所需要的。另外,除非您期望空值,否則您並不真的想要使用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 2012-04-03 13:37:47

2

您目前連接到mdl_forum_posts上mdl_log用戶標識。

這意味着特定用戶的每個記錄的操作記錄都將鏈接到該用戶所做的每個帖子(而不是將特定帖子鏈接到發佈操作的日誌)。