如何从2个表中获得MySQL的排名?

时间:2014-06-25 13:05:15

标签: mysql sql sorting

我的数据库中有两个不同的表,名称为:rank,settings。

以下是每个表的外观如下:

表#rank:

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

表#settings:

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

任何想法,我怎么能在这里实现我的目标?

2 个答案:

答案 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;