2016-07-14 5 views
2

У меня есть списки пользователей с его точками и идентификатором игры. Мне нужно найти ранг указанного пользователя на основе порядка игры на максимальную lb_point. Ниже мой стол.Mysql выбрать количество запросов до достижения условия

lb_id user_id game_id room_id lb_point 
------------------------------------------------ 
1   1  2   1   670  
2   1  1   2   200  
3   1  2   2   650  
4   1  1   1   400  
5   3  2   1   700  
6   4  2   5   450  
7   2  1   3   550  
8   2  1   1   100  
9   1  1   1   200  

Я уже сделал это, используя PHP-код и его работу в порядке следующим образом.

$game_id = 2; 
$user_id = 1; 
$query_rnk = $this->db->query('SELECT user_id AS uid FROM leader_board WHERE game_id = "'.$game_id.'" GROUP by user_id ORDER BY lb_point DESC'); 
     if ($query_rnk->num_rows() > 0){ 
      $j=1; 
      foreach($query_rnk->result() as $row_rnk){ 
       if($row_rnk->uid == $user_id){ 
        $rnk_status = 1; 
        break; 
       } 
      $j++; 
      } 
      if($rnk_status == 1){ 
       $resp['rank'] = $j; 
      } 
     } 

Ответ: 2.

Но мне нужно, чтобы найти это с помощью одного запроса. Есть идеи?

+0

Возможно, какое-то объяснение о том, что делает этот код, поможет. – sagi

ответ

2

Вы могли бы сделать с отборным подсчетом количества строк надлежащего выбором

select count(*) 
from (
     select distinct user_id 
     from leader_board 
     where lb_point >= (select max(lb_point) 
      from leader_board 
      where user_id = 1 
      and game_id = 2) 
     and game_id = 2 
) t 
+0

Не работает. – Naren

+0

получение ошибки "# 1242 - Подзапрос возвращает более 1 строки" – Naren

+0

У меня есть обновление thge answer .. (вы не cjeck для room_id?) – scaisEdge

0

Если вы хотите, чтобы получить звание user_id = 1, попробуйте следующее:

SELECT urank 
FROM (
    SELECT user_id AS uid, @rank := @rand + 1 AS urank 
    FROM leader_board 
    CROSS JOIN (SELECT @rank := 0) t 
    WHERE game_id = '$game_id' 
    GROUP by user_id 
    ORDER BY lb_point DESC 
) tmp 
WHERE uid = '$user_id' 
0
SELECT count(*)+1 as Rank from (select lb_point from games where game_id =2 order by lb_point DESC) as list where list.lb_point > (select max(lb_point) from games where user_id = 1 and game_id = 2) 

Этого даст ранг 2 для user_id = 1 в game_id = 2, который является ответом, о котором вы упомянули.

 Смежные вопросы

  • Нет связанных вопросов^_^