我的数据库中有两个不同的表,名称为:rank,settings。
以下是每个表的外观如下:
id points userid
-- ----- ------
1 500 1
2 300 2
3 900 3
4 1500 4
5 100 5
6 700 6
7 230 7
8 350 8
9 850 9
10 150 10
userid active
------ ------
1 0
2 1
3 1
4 1
5 1
6 0
7 1
8 1
9 0
10 1
我希望按user_id
表排序rank
获取特定用户的排名。另外,我只想在排名结果中包含用户,如果他们在active = 1
表中设置了settings
。
我有一个简单的排名查询,但它并不真正有效,因为它确实包括所有人,即使用户不活跃:
SELECT * FROM
(SELECT @sort:=@sort+1 AS sort, points, userid
FROM rank,
(SELECT @sort := 0) s
ORDER BY points DESC) t
WHERE userid= 8
任何想法,我怎么能在这里实现我的目标?
答案 0 :(得分:1)
很少有子查询。首先获得以正确顺序活动的所有用户。这用作另一个查询的来源以添加排名。然后,这将用作您实际感兴趣的用户ID的点和等级的来源
SELECT sort, points
FROM
(
SELECT @sort:=@sort + 1 AS sort, points, userid
FROM
(
SELECT rank.points, rank.userid
FROM rank
INNER JOIN settings
ON rank.userid = settings.userid
WHERE settings.active = 1
ORDER BY points DESC
) sub0
CROSS JOIN (SELECT @sort:=0) sub2
) sub1
WHERE sub1.userid = 8
答案 1 :(得分:0)
从https://stackoverflow.com/a/4474389/92063
借用这个想法SELECT
@rn:=@rn+1 AS RANK
,USER_ID
,POINTS
FROM (
SELECT
R.userid AS USER_ID
,R.points AS POINTS
FROM
rank R
INNER JOIN
settings S
ON R.userid = S.userid
WHERE
S.active = 1
ORDER BY
R.points DESC
) t1, (SELECT @rn:=0) t2;