Mysql select查询次数直到达到条件
Mysql select query count until reach the condition
我有用户列表以及他的积分和游戏 ID。我需要根据最大lb_point的游戏顺序找到指定用户的排名。下面是我的table。
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.
但我需要使用一个查询来找到它。有什么想法吗?
您可以使用 select 计算适当 select
的行数
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
如果你想获得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'
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)
这将为 user_id = 1 在 game_id = 2 中给出排名 2,这是您在问题中提到的答案。
我有用户列表以及他的积分和游戏 ID。我需要根据最大lb_point的游戏顺序找到指定用户的排名。下面是我的table。
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.
但我需要使用一个查询来找到它。有什么想法吗?
您可以使用 select 计算适当 select
的行数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
如果你想获得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'
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)
这将为 user_id = 1 在 game_id = 2 中给出排名 2,这是您在问题中提到的答案。