在按总和排序后,找出特定行的行号

时间:2011-08-18 18:25:51

标签: mysql

我有一张像这样的桌子:

wins(userid, wins, losses)

我正在运行这样的查询来订购表格:

SELECT winloss.userid AS userid, 
(winloss.wins*3) - winloss.losses AS winloss 
FROM site_win_loss AS winloss WHERE winloss.userid 
NOT IN (0, 1, 2, 3, 4, 5, 26, 32, 46, 90) ORDER BY winloss DESC

这样做是为每个用户分配他们的分数,并以排行榜格式对其进行排序。现在在我的实际实现中,我使用一个简单的php计数在名称旁边放置1,2,3等,但我知道我也可以这样做:

SELECT @rownum:=@rownum+1 as rank,
winloss.userid AS userid,
(winloss.wins*3) - winloss.losses AS winloss
FROM site_win_loss AS winloss, 
(select @rownum:=0) a
WHERE winloss.username NOT IN (0, 1, 2, 3, 4, 5, 26, 32, 46, 90)
ORDER BY winloss DESC

现在,让我们说上面的内容返回以下内容:

rank  | userid  | winloss
1     | 45      | 657
2     | 54      | 587
3     | 26      | 501
4     | 76      | 532
5     | 34      | 476
6     | 63      | 412
7     | 23      | 367
8     | 84      | 314
9     | 41      | 265
10    | 96      | 201

无论如何我可以抓住上面的特定行吗?例如,如果我想要上面的JUST用户41的详细信息,那么SQL语句将仅返回:

rank  | userid  | winloss
9     | 41      | 265

提前致谢

3 个答案:

答案 0 :(得分:1)

我可能会误解,但假设您正在从上面的查询中生成一个表,为什么不能简单地使用简单的select / where语句查询该表来获取指定的记录?例如,

select *
from #ranktable
where userid = 41

答案 1 :(得分:1)

使用外部查询

Select *
FROM(
SELECT @rownum:=@rownum+1 as rank,
winloss.userid AS userid,
(winloss.wins*3) - winloss.losses AS winloss
FROM site_win_loss AS winloss, 
(select @rownum:=0) a
WHERE winloss.username NOT IN (0, 1, 2, 3, 4, 5, 26, 32, 46, 90)

)a
where a.userid = 41

答案 2 :(得分:1)

另一个不使用子查询(但可能效率不高)的选项是使用HAVING子句。

类似的东西:

SELECT @rownum:=@rownum+1 as rank,
    winloss.userid AS userid,
    (winloss.wins*3) - winloss.losses AS winloss
FROM site_win_loss AS winloss, 
    (select @rownum:=0) a
WHERE winloss.username NOT IN (0, 1, 2, 3, 4, 5, 26, 32, 46, 90)
HAVING rank = 9
ORDER BY winloss DESC

但是,这会导致在新输出中重新计算排名的不良结果,但它应该会为您提供所需的记录。

编辑:移动了HAVING的位置。