MySQL ВЫБЕРИТЕ DISTINCT ПОРЯДОК ЗАДАЧИ - PullRequest
2 голосов
/ 15 июля 2011

Для начала у меня есть 4 таблицы, с которыми я имею дело.

У меня есть таблица классов , которая является отношением 1-> N с таблицей секции , которая также имеет отношение 1-> N с уроками таблица.

Таким образом, чтобы выразить это следующим образом:

  • Классы
    • Разделы
      • Занятия

Последняя таблица - это activityLog , когда студент получает доступ к уроку, это записывается с использованием следующего:

ActivityLog Row -> actorID (идентификатор пользователя), 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

Я не могу понять, почему не отображаются последние записи.

Ответы [ 3 ]

2 голосов
/ 15 июля 2011

На основании ваших изменений, как вам это подходит?

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, но я оставил его на всякий случай.

0 голосов
/ 15 июля 2011

Ну, в 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)
0 голосов
/ 15 июля 2011

Попробуйте группу, как показано ниже GROUP BY activityLog.classID, activityLog.sectionID, ActivityLog.lessonID

Я думаю, что это сработает, или просто прислал мне создать сценарий для этого, я создам этот запрос

...