MySQL Query Help Поиск ранга по идентификатору - PullRequest
1 голос
/ 01 июня 2011

Я пытаюсь изменить следующий запрос, чтобы найти ранг конкретного видеоида, и мне не повезло, может кто-нибудь предложить решение?

  SELECT videoid wins/loses as win_loss, 
         @curRank := @curRank + 1 AS rank
    FROM cb_video, 
         (SELECT @curRank := 0) r  
ORDER BY wins/loses DESC

Я пытался создать подобный подзапрос, но он не удался:

SELECT rank 
  FROM (SELECT videoid wins/loses as win_loss, 
               @curRank := @curRank + 1 AS rank 
          FROM cb_video, 
               (SELECT @curRank := 0) r  
      ORDER BY wins/loses DESC) 
 WHERE videoid = 116

Также добавление видеоида в предложение WHERE без подзапроса просто всегда показывает ранг, являющийся позицией # 1, так как возвращает только одну строку:

  SELECT videoid wins/loses as win_loss, 
         @curRank := @curRank + 1 AS rank 
    FROM cb_video, 
         (SELECT @curRank := 0) r 
   WHERE videoid = 116 
ORDER BY wins/loses DESC

Есть идеи, как ограничить результат определенным идентификатором, но при этом сохранить ранг? К вашему сведению, я сохраняю два столбца (выигрывает и проигрывает), если это поможет.

Ответы [ 3 ]

1 голос
/ 01 июня 2011
SELECT a.videoid, 
(SELECT COUNT(*) FROM cb_video b 
 WHERE a.videoid !=b.videoid 
 AND (b.wins/b.loses) > (a.wins/a.loses))+1 AS rank
FROM cb_video a
WHERE a.videoid = 116
1 голос
/ 01 июня 2011

Я проверил это на простом подмножестве, созданном из таблицы, подобной той, что вы описали ... Она возвращает ОДНО видео и его фактический окончательный ранг всего набора ...

select *
   from ( SELECT 
              videoid, 
              wins, 
              losses, 
              wins/losses,       
              @curRank := @curRank +1 Rank
           FROM 
              cb_video,
              ( select @curRank := 0 ) r
           order by 
              wins/losses desc ) PreQuery
    where
       PreQuery.VideoID = 116
1 голос
/ 01 июня 2011

Попробуйте что-то вроде этого:

SELECT videoid, rank FROM (SELECT videoid, wins/loses as win_loss, @curRank := @curRank + 1 AS rank FROM cb_video, (SELECT @curRank := 0) r  ORDER BY wins/loses DESC) s WHERE videoid = 116
...