0

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

我想要一个查询,它返回我根据点指定的 user_id 的 RANK,因为 pointsgiven 是真的。更重要的是,我需要包括领带。如果我想使用以下查询,我可以得到所有等级的结果集

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 上的排名。我在这里做错了什么?

4

1 回答 1

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)查询应使用索引。

只看一个排名,这甚至可能比你的方法更快。

于 2013-07-30T00:26:50.703 回答