MySQL SELECT DISTINCT ORDER BY 问题

发布于 2024-11-25 00:28:52 字数 1846 浏览 5 评论 0原文

首先,我正在处理 4 张桌子。

我有一个 classes 表,它与 sections 表之间存在 1->N 关系,而 sections 表也与 lessons 存在 1->N 关系强>表。

因此,从正确的角度来看:

    • 部分
      • 教训

最后一个表格是一个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

我无法弄清楚为什么没有显示最新记录。

To begin with I have 4 tables I am dealing with.

I have a classes table that is a 1->N relationship with a sections table which also has a 1->N relationship with a lessons table.

So to put it in perpective:

  • Classes
    • Sections
      • Lessons

The last table is an activityLog, when the student accesses a lesson this is recorded using the following:

ActivityLog Row -> actorID (user ID), classID, sectionID, lessonID

I want to pull out the last 5 unique lessons the student has visited. I tried using both DISTINCT and GROUP BY without success.

The same records are being returned each time, not the latest classes that they have visited.

Using 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

Using 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

I cannot figure out why the latest records are not being displayed.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

芯好空 2024-12-02 00:28:53

尝试如下分组
GROUP BY ActivityLog.classID、activityLog.sectionID、activityLog.lessonID

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

Try group by like below
GROUP BY activityLog.classID,activityLog.sectionID,activityLog.lessonID

I think it will work, or just sent me create scripts for these I will create that query

谷夏 2024-12-02 00:28:53

好吧,我希望 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)

Well, there's got to be a datetime in the ActivityLog I hope... so Try this:

 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)
澜川若宁 2024-12-02 00:28:52

根据您的更改,这是否适合您?

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,但为了以防万一,我保留了它。

Based on your change, how does this suit you?

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

Based on your description, I'm not sure why you're using LEFT JOIN, but I've left it in just in case.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文