Mysql SQL用户排名取决于信誉点

Mysql SQL用户排名取决于信誉点,mysql,sql,database,Mysql,Sql,Database,如何根据信誉点获得用户排名。 排除“超级管理员”和“员工”角色 我的查询: 当我提出包括所有用户在内的请求时,排名就像我期望的那样,但是 当我提出请求时,排除了角色为“超级管理员”和“职员”的用户,排名是错误的 SELECT u.id, u.rank FROM ( SELECT u.id, @rownum := @rownum +1 AS rank FROM users u, (SELECT @rownum :=0 ) r ORDER BY u.reputa

如何根据信誉点获得用户排名。
排除“超级管理员”和“员工”角色

我的查询:
当我提出包括所有用户在内的请求时,排名就像我期望的那样,但是 当我提出请求时,排除了角色为“超级管理员”和“职员”的用户,排名是错误的

SELECT u.id, u.rank 
FROM (
      SELECT u.id, @rownum := @rownum +1 AS rank
      FROM users u, (SELECT @rownum :=0 ) r
      ORDER BY u.reputation DESC, u.register_date ASC
     ) AS u
LEFT JOIN users_role ur ON ur.user_id = u.id
LEFT JOIN roles r ON r.id = ur.role_id
WHERE r.key_role NOT IN ('super_admin','staff')
AND u.id=3
表格:

users table

ID    REPUTATION     REGISTERED_DATE
1     6000           2018-05-20 14:15:10
2     20             2018-05-22 14:15:10
3     2000           2018-05-25 14:15:10
4     350            2018-05-27 14:15:10
5     14             2018-05-27 19:15:10
6     0              2018-05-28 14:15:10
7     584            2018-05-29 14:15:10
8     54             2018-05-30 14:15:10


users_roles table

ID    USER_ID        ROLE_ID
1     1              1
2     2              2
3     3              3
4     4              3
5     5              3
6     6              3
7     7              3
8     8              3


roles table

ID    NAME              KEY_ROLE
1     Super Admin       super_admin
2     Staff             staff
3     Registered user   registered_user

这基于您的代码:

SELECT id, rank FROM (
  SELECT u.id, @rownum := @rownum +1 AS rank 
  FROM (
      SELECT u.id
      FROM users u
      LEFT JOIN users_roles ur ON ur.user_id = u.id
      LEFT JOIN roles r ON r.id = ur.role_id
      WHERE r.key_role NOT IN ('super_admin','staff')
      ORDER BY u.reputation DESC, u.registered_date ASC
     ) AS u
  ,(SELECT @rownum :=0 ) r
) AS t 
WHERE id=3
请参见

我在内部查询中包含了所有条件。

我相信这就是您想要的:

SELECT u.id, u.rank 
FROM (SELECT u.id, (@rownum := @rownum + 1) AS rank
      FROM users u CROSS JOIN
           (SELECT @rownum := 0 ) r
      WHERE NOT EXISTS (SELECT 1
                        FROM users_role ur JOIN
                             roles r
                             ON r.id = ur.role_id
                        WHERE ur.user_id = u.id AND
                              r.key_role NOT IN ('super_admin', 'staff')
                       )
      ORDER BY u.reputation DESC, u.register_date ASC
     ) u
WHERE u.id = 3;
特别是,具有多个角色的用户不会影响排名


请注意,在较新版本的MySQL中,变量不能很好地与ORDER BY配合使用,因此需要额外的子查询。在最新版本中,您只需使用窗口功能。

这是什么条件
…并且u.id=3
?@forpas我想获得用户id 3的排名