Почему я получаю повторяющиеся результаты в моем запросе? - PullRequest
3 голосов
/ 03 апреля 2012

Я использую базу данных 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')    

Проблема в том, что я получаю повторяющиеся результаты.

Ответы [ 3 ]

2 голосов
/ 03 апреля 2012

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

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

1 голос
/ 03 апреля 2012

Нет необходимости использовать таблицу логов - все, что вам нужно, - это то, что пост был добавлен и имеет метку времени. Кроме того, вы на самом деле не хотите использовать 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 голосов
/ 03 апреля 2012
   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 может помочь вам

...