2012-04-03 4 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' легко получить обманы. – JNK

+0

Можете ли вы добавить свои структуры таблиц к вопросу? –

+0

Какую версию moodle вы используете? – iankit

ответ

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

2

Вы в настоящее время связь mdl_forum_posts с mdl_log на идентификатору пользователя.

Это означает, что каждая зарегистрированная запись действия для конкретного пользователя будет связана с каждым сообщением, сделанным этим пользователем (вместо привязки определенного сообщения к журналу действия публикации).

Смежные вопросы