2011-07-15 90 views
2

首先我要處理4個表格。MySQL SELECT DISTINCT ORDER BY問題

我有一個表是一個1->用部分表也具有1->用教訓N的關係表N的關係。

所以把它放在角度探討:

      • 教訓

最後一個表是一個activityLog,當學生訪問,這是使用以下記錄的啓示是:

ActivityLog行 - >的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 

爲什麼不顯示最新記錄我想不通。通過像下面 集團

+0

您是否有示例輸入和輸出數據? – MatBailie

回答

2

,請問這合適嗎?

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

對不起,我編輯了我的描述。我需要訪問最後5個獨特的課程。我仍然沒有得到正確的順序。他們被訪問的日期似乎沒有什麼區別。我得到5個獨特的結果,但它們按照它們最初訪問的順序被卡住。就像我訪問最後一個結果的課程一樣,它應該移回頂部。 – simpiligno

+0

根據您的更改答覆更新。 – MatBailie

+0

它的工作原理!非常感謝!我想知道做一個子查詢,但我沒有太多的經驗。 – simpiligno

0

嘗試GROUP BY activityLog.classID,activityLog.sectionID,activityLog.lessonID

我認爲它會工作,或者只是給我發了創建這些我將創建一個查詢腳本

0

那麼,有一定是在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

在SQL示例中提到'activityLog.activityDate'。 – MatBailie