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