2011-08-23 94 views
0

我不太清楚如何編寫這個查詢它可以在一個查詢中完成。 這裏是:Help with MySql query

我需要選擇一個標籤名稱列表,併爲每個標籤獲取最近標記的相冊信息。這意味着如果用戶創建一個名爲「Pamela Anderson」的專輯並將該專輯標記爲「Blondes」,那麼該專輯​​現在是Blondes最近標記的專輯。 可能有100個專輯標記爲「金髮女郎」,但只有最近的一個數據應該被選中,由objectTagCreateDate決定。

預期的數據是這樣的:

tagId, tagName, objectTagCreateDate, albumName,  albumPath 
    -------------------------------------------------------------------- 
    1,  Blondes, 2011-08-23,   Pamela Anderson, 7345 
    2,  Celebs, 2011-08-20,   Kate Winslet, 2, 5567 
    3,  Musicians, 2011-08-22,   Alicia Keys,  6678 

的表是這樣的:

Tag 
- tagId 
- tagName 

ObjectTag 
- objectType 
- objectId 
- tagId 
- objectTagCreateDate 

Album 
- albumId 
- albumName 
- albumPath 

的加入發生在:

tag.tagId = objectTag.tagId AND objectTag.objectType = 3 and objectTag.objectId = album.albumId 

燦這樣做在一個查詢中,如果是的話如何? 感謝

回答

3
SELECT t.tagId, t.tagName, o.objectTagCreateDate, a.albumName, a.albumPath 
FROM ObjectTag AS o 
INNER JOIN (
      SELECT tagId, MAX(objectTagCreateDate) As MaxDate 
      FROM ObjectTag 
      WHERE ObjectTag.objectType = 3 
      GROUP BY tagId 
      ) AS t1 
ON t1.tagId = o.tagId AND t1.MaxDate = o.objectTagCreateDate 
INNER JOIN Tag AS t ON t1.tagId = t.tagId 
INNER JOIN Album AS a ON o.objectID = a.albumId 

內選擇得到MaxDate每個標籤識別,並與ObjectTag加入以獲得相應的o.objectID。其餘的只是簡單的連接。

+0

謝謝 - 這個作品很棒。我不得不做一個小小的改變,可能是一個錯字。我把這個'ON t1.tagId = o.tagId,t1.MaxDate = o.objectTagCreateDate'改成了'ON t1.tagId = o.tagId AND t1.MaxDate = o.objectTagCreateDate'逗號導致了一個錯誤。 – Cheeky

+0

心靈的滑落!感謝您修復它:) – Jacob

0

這樣的事情應該這樣做,但我沒有自己測試過;

SELECT T.tagId, T.tagName, MAX(OT.objectTagCreateDate) AS LatestObjectTagCreateDate, A.albumName, A.albumPath 
FROM ObjectTag OT 
JOIN Tag T ON (T.tagId = OT.tagId) 
JOIN Album A ON (A.albumId = OT.objectId AND OT.objectType = 3) 
GROUP BY T.tagId 
ORDER BY T.tagId