我有一个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上的排名返回。我在这里做错了什么?
答案 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)
上的索引。
要查看一个排名,这甚至可能比您的方法更快。