2012-02-03 55 views
0

我想要做的是相當於一個「音樂排行榜」表。MySQL排名對比

我有一個視頻播放表,我想對過去24小時播放的視頻進行排名,並將它們與之前24小時的排名進行比較。

所以輸出應該是影片ID,該ID的當前等級和排名的前一天的ID

表包括:

PlayID (the specific id to the play table) 
IP (IP address of the user who played the video) 
VIDEOID (ID of the specific video, what needs to be ranked by most occurances) 
playtime (linux time when played) 

的表稱爲video_plays7d。

這一直困擾着我,我無法弄清楚,有什麼想法嗎?

回答

1

首先,您需要的所有視頻的完整列表,所以如果在一天的任何發揮,而不是其他,你不會失去這個實例...內預先查詢應該得到視頻的所有可能和它們各自的計入當前日期或之前,但WHERE子句限制爲僅兩天。內部查詢還預先命令IT首先通過「前一天」計數遞減,並應用@var來構建排名。從那裏,重新查詢所有這些結果,但這一次,根據「今天」計數降序排列,並將排名應用於該設置。全部完成後,它應該顯示從1到今天的排名,但排名前一天可能會分別與他們的計數錯開。

select 
     AllPlays.VideoID, 
     AllPlays.CntToday, 
     @RankToday := @RankToday +1 as TodayRank, 
     AllPlays.CntBefore, 
     AllPlays.BeforeRank 
    from 
     (select vp.VideoID, 
       sum(if(date(FROM_UNIXTIME(vp.playtime)) = curdate(), 1, 0)) as CntToday, 
       sum(if(date(FROM_UNIXTIME(vp.playtime)) < curdate(), 1, 0)) as CntBefore, 
       @RankBefore := @RankBefore +1 as BeforeRank 
      from 
       video_plays7d vp 
       join (select @RankBefore := 0) SQLVars 
      where 
       date(FROM_UNIXTIME(vp.playtime)) >= date_sub(curdate(), interval 1 day) 
      group by 
      vp.VideoID 
      order by 
       CntBefore DESC 
    ) As AllPlays 
     join (select @RankToday := 0) as SqlVars2 
    order by 
     AllPlays.CntToday DESC 
+0

工作,非常感謝你。 – JimmyBanks 2012-02-03 16:43:48

+0

@Jimmy,歡迎您...只是一個一個供參考,作爲一個新手,當你提出問題並得到答案,其共同的標記爲正反饋的答案是正確的(和可能的向上箭頭票)。其他可能正在尋找類似問題的人想知道「答案」是否有希望解決類似問題。 – DRapp 2012-02-03 16:47:19

+0

好吧,我會這麼做的,不幸的是,它不會允許我把箭頭放在任何東西上,但我標記它是正確的。再次感謝 – JimmyBanks 2012-02-03 16:50:30