【问题标题】:Why am I getting duplicate results in my query?为什么我在查询中得到重复的结果?
【发布时间】:2019-04-09 21:30:32
【问题描述】:

我正在使用 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')    

我遇到的问题是我得到了重复的结果。

【问题讨论】:

  • 您还应该显示一些示例数据...有这么多JOINs,很容易上当受骗。
  • 您可以将您的表结构添加到问题中吗?
  • 你用的是哪个moodle版本?

标签: sql moodle


【解决方案1】:

您当前正在将 mdl_forum_posts 链接到用户 ID 上的 mdl_log。

这意味着特定用户的每个记录的操作记录都将链接到该用户发布的每个帖子(而不是将特定帖子链接到发布操作的日志)。

【讨论】:

    【解决方案2】:

    无需使用日志表 - 您只需要添加帖子并具有时间戳即可。此外,除非您期望 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)
    

    【讨论】:

      【解决方案3】:
         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 可能对您有所帮助

      【讨论】:

      • 您好,感谢您这么快回复我,不幸的是我尝试了这个,但我仍然得到相同的结果:(。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 2021-02-18
      • 2011-09-25
      相关资源
      最近更新 更多