我有一张像这样的桌子:
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
提前致谢
答案 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的位置。