2012-02-03 2 views
0

내가하려는 것은 "음악 차트"테이블과 같습니다.MySQL 순위 비교

나는 비디오 재생 목록을 가지고 있으며, 지난 24 시간 동안 재생 된 비디오의 순위를 정하고 그 전에 24 시간 동안의 순위와 비교하려고합니다.

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 :

그래서 출력은 동영상 ID는 ID의 현재 순위 및 순위

테이블이 구성되어 ID의 이전 일해야한다.

이것은 저를 곤두박이로하고 있습니다.

답변

1

먼저 모든 비디오의 전체 목록이 필요하므로 언젠가는 재생되고 나머지는 재생되지 않으면 해당 인스턴스가 풀리지 않습니다 ... 내부 사전 쿼리는 가능한 모든 비디오 및 각각의 비디오를 가져와야합니다 현재 날짜 또는 이전에 계산되지만 WHERE 절은 2 일로 제한합니다. 또한 내부 쿼리는 IT 선착순으로 "Day Before"카운트를 내림차순으로 계산하고 @var를 적용하여 순위를 만듭니다. THAT에서 그 모든 결과를 다시 쿼리하지만 이번에는 "TODAY"카운트를 내림차순으로 정렬하고 그 값을 순위에 적용합니다. 모두 끝나면 오늘부터 1 월 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

+0

@ 지미, 천만에 ... 환영합니다 ... 초보자로서, 질문을 올리고 답변을 얻을 때 긍정적 인 피드백에 대해 올바른 대답으로 표시 할 수 있습니다. 유사한 질문을 찾고있는 다른 사람들은 "대답"이 그들의 유사한 문제를 해결하기 위해 발견 되었는지를 알고 싶어합니다. – DRapp

+0

좋아, 내가 할거야, 불행히도 아직 아무 것도 올리지 못하게 해줄거야. 다시 한 번 감사드립니다. – JimmyBanks