在此评分表中找到我之前的排名会有什么好的查询?

时间:2016-01-21 21:44:43

标签: php mysql sql

我目前正在使用此查询来查找玩家的排名:

select
    coalesce(
        (
            select count(1)
            from scores b
            where
                b.top > a.top OR
                (
                    b.top = a.top AND
                    b.time < a.time
                )
        ), 0
    ) + 1 Rank
from
    Scores a
where
    user = ?

我有一个这样的分数表:

id           int
user         varchar(100)
time         int (timestamp)
top          int

最近这样的表格如下:

id           int
user         varchar(100)
time         int (timestamp)
score        int
istopscore   int (boolean 1/0)

数据库已经填满了数据,所以我不能简单地改变数据库的结构。最近的表中有超过200.000行,因此排序需要花费大量时间。我想尽快找到一种方法来做到这一点。

我如何找到球员的先前排名?这是我尝试过的:

select
    coalesce(
        (
            select count(1)
            from recent b
            where
                b.istopscore = 1 AND
                (
                    (
                        b.score > a.top AND
                        b.time <= a.time
                    ) OR
                    (
                        b.score = a.top AND
                        b.time < a.time
                    )
                )
            ), 0) + 1 Rank
from scores a
where user = ?

此查询的问题在于,如果用户已获得多个新的最高分,则会对所有这些分数进行计数,因此无法提供正确的结果。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我认为您的查询几乎正确。要解决多个最高分的问题,您可以使用 try{ HttpServletResponse res = PortalUtil.getHttpServletResponse(response); String url = PortalUtil.getCurrentCompleteURL(PortalUtil.getHttpServletRequest( req ) ); String param1=getParamValue(url,"p");//logic here to return param from URL if(param1!=null && param1.trim().length()>0){ requestPageNumber=Integer.parseInt(param1); } if(requestPageNumber<=uiState.getPageNunmber())//valid {} else//invalid { res.sendRedirect( "/proposerdetails?p="+uiState.getPageNunmber() ); } } catch(Exception e) { e.printStackTrace(); } ,例如this

count(distinct username)