【问题标题】:MySQL SELECT DISTINCT ORDER BY problemMySQL SELECT DISTINCT ORDER BY 问题
【发布时间】:2011-07-15 14:01:55
【问题描述】:

首先,我要处理 4 个表。

我有一个 classes 表,它与 sections 表具有 1->N 关系,而 sections 表也与 lessonsN 关系/strong> 表格。

所以从长远来看:

  • 课程
    • 部分
      • 课程

最后一个表是activityLog,当学生访问课程时,会使用以下内容进行记录:

ActivityLog Row -> actorID(用户 ID)、classID、sectionID、lessonID

我想提取学生最近学习过的 5 个独特课程。我尝试同时使用 DISTINCT 和 GROUP BY 都没有成功。

每次都返回相同的记录,而不是他们访问过的最新课程。

使用 GROUP BY

SELECT activityLog.actorID, activityLog.activityDate,
        strClasses.classID, strClasses.className,
        strSections.sectionID, strSections.sectionName,
        strLessons.lessonID, strLessons.lessonName

FROM activityLog            
LEFT JOIN strClasses ON strClasses.classID = activityLog.classID
LEFT JOIN strSections ON strSections.sectionID = activityLog.sectionID
LEFT JOIN strLessons ON strLessons.lessonID = activityLog.lessonID
WHERE activityLog.activityTypeID = 6 AND activityLog.actorID = 3
GROUP BY activityLog.lessonID
ORDER BY activityLog.activityDate DESC
LIMIT 5

使用 DISTINCT

SELECT DISTINCT activityLog.actorID,
        strClasses.classID, strClasses.className,
        strSections.sectionID, strSections.sectionName,
        strLessons.lessonID, strLessons.lessonName
FROM activityLog            
LEFT JOIN strClasses ON strClasses.classID = activityLog.classID
LEFT JOIN strSections ON strSections.sectionID = activityLog.sectionID
LEFT JOIN strLessons ON strLessons.lessonID = activityLog.lessonID
WHERE activityLog.activityTypeID = 6 AND activityLog.actorID = 3
ORDER BY activityLog.activityDate DESC
LIMIT 5

我不知道为什么没有显示最新记录。

【问题讨论】:

  • 你有示例输入和输出数据吗?

标签: mysql sql group-by left-join distinct


【解决方案1】:

根据您的更改,这适合您吗?

SELECT activityLog.actorID, activityLog.activityDate,
        strClasses.classID, strClasses.className,
        strSections.sectionID, strSections.sectionName,
        strLessons.lessonID, strLessons.lessonName
FROM activityLog            
LEFT JOIN strClasses ON strClasses.classID = activityLog.classID
LEFT JOIN strSections ON strSections.sectionID = activityLog.sectionID
LEFT JOIN strLessons ON strLessons.lessonID = activityLog.lessonID
WHERE activityLog.activityTypeID = 6 AND activityLog.actorID = 3
AND activityLog.activityDate = (SELECT MAX(activityDate) FROM activityLog AS lookup WHERE lessonID = activityLog.lessonID)
ORDER BY activityLog.activityDate DESC
LIMIT 5

根据你的描述,我不确定你为什么使用LEFT JOIN,但我把它留了以防万一。

【讨论】:

  • 抱歉,我编辑了我的描述。我需要访问最后 5 个独特的课程。我仍然没有得到正确的顺序。他们被访问的日期似乎没有什么不同。我得到 5 个独特的结果,但它们按照最初访问的顺序卡住了。就像我访问最后一个结果的课程一样,它应该移回顶部。
  • 有效!非常感谢!我想知道做一个子查询,但我没有太多经验。
【解决方案2】:

尝试按如下方式分组 GROUP BY activityLog.classID,activityLog.sectionID,activityLog.lessonID

我认为它会起作用,或者只是向我发送了为这些创建脚本,我将创建该查询

【讨论】:

    【解决方案3】:

    嗯,我希望 ActivityLog 中必须有一个日期时间......所以试试这个:

     Select s.Name, c.ClassName
     From Students s
         left Join On Classes c
              On c.ClassId In 
                   (Select Distinct ClassId From Classes
                    Where (Select Count(Distinct ClassId) From Classes ic
                             Join ActivityLog l On l.UserId = s.UserId
                                And l.ClassId = c.ClassId                         
                           Where classId = c.ClassId
                              And activityDateTime > l.activityDateTime) 
                        < 5)
    

    【讨论】:

    • activityLog.activityDate 在 SQL 示例中被提及。
    猜你喜欢
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多