具有基于列返回错误的Ties的MySQL排名ID

时间:2013-07-29 23:32:03

标签: mysql

我有一个1表数据库(以简化形式)以下字段: user_id(INT),ref_id(INT),points(INT),pointsgiven(BOOL / TINY_INT)

如果pointsgiven为true,我想要一个返回基于点指定的user_id的RANK的查询。踢球者,我需要包括关系。如果我想使用以下查询

,我可以获得所有排名的结果集
SELECT 
user_id, ref_id, points, pointsgiven, 
CASE 
        WHEN @points = COALESCE(points, 0) THEN @rownum 
        ELSE @rownum := @rownum + 1 
END AS rank,
@points := COALESCE(points, 0)
FROM users CT
JOIN 
(
        SELECT @rownum := 0, @points := NULL
) r
WHERE pointsgiven=TRUE ORDER BY points DESC

因此,基于此,我认为我可以将其用作子查询来获取某个user_id,如下所示:

select * from 
(
    SELECT 
    user_id, ref_id, points, pointsgiven, 
    CASE 
            WHEN @points = COALESCE(points, 0) THEN @rownum 
            ELSE @rownum := @rownum + 1 
    END AS rank,
    @points := COALESCE(points, 0)
    FROM users CT
    JOIN 
    (
            SELECT @rownum := 0, @points := NULL
    ) r
    WHERE pointsgiven=TRUE ORDER BY points DESC
) as derived WHERE user_id = 15

但是这会将[BLOB - 1 B]作为正确user_id上的排名返回。我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

我不知道为什么你的查询不起作用。但是,对于单个用户ID,您可以使用相关子查询:

select user_id, ref_id, points, pointsgiven,
       coalesce((select count(distinct user_id)
                 from users u2
                 where u2.pointsgiven=TRUE and
                       u2.points > u.points
                ) + 1, 1) as rank
from users u
where user_id = 15;

查询应该使用users(pointsgiven, points, user_id)上的索引。

要查看一个排名,这甚至可能比您的方法更快。