MySQL - 获取行在结果集中的位置

MySQL - Getting the position of a row in a result set

我有以下 MySQL 查询:

SELECT serverusers.serverID, serverusers.userID, serverusers.xpTotal, users.bot 
FROM users INNER JOIN serverusers ON users.userID = serverusers.userID 
WHERE users.bot = 'false' && serverID = 318467989655781389 
ORDER BY xpTotal DESC

我需要使用它来查找特定 userID 在其 "rank" 中的位置。例如:

+---------+-----------+------------+----------+
 serverID | userID    | xpTotal    | bot      |
----------------------------------------------+
 50       | 23892     | 200        | false    |
----------------------------------------------+
 50       | 27173     | 180        | false    |
----------------------------------------------+
 50       | 17294     | 150        | false    |
----------------------------------------------+
 50       | 72973     | 110        | false    |

如果我要提供 17294userID,它应该 return 3 因为 17294 是第 3 行。

也许使用变量的简单方法:

SELECT suu.*
FROM (SELECT su.serverID, su.userID, su.xpTotal, u.bot,
             (@rn := @rn + 1) as rn
      FROM users u INNER JOIN
           serverusers su
          ON u.userID = su.userID CROSS JOIN
          (SELECT @rn := 0) params
      WHERE u.bot = 'false' AND su.serverID = 318467989655781389 
      ORDER BY xpTotal DESC
     ) suu
WHERE userID = ?;

MySQL 的最新版本在 ORDER BY 之前处理 SELECT 中的变量。所以,你可能需要一个额外的子查询层:

SELECT suu.*
FROM (SELECT su.serverID, su.userID, su.xpTotal, u.bot,
             (@rn := @rn + 1) as rn
      FROM (SELECT su.serverID, su.userID, su.xpTotal, u.bot
            FROM users u INNER JOIN
                 serverusers su
                 ON u.userID = su.userID
            WHERE u.bot = 'false' AND su.serverID = 318467989655781389 
            ORDER BY xpTotal DESC
           ) suu CROSS JOIN
           (SELECT @rn := 0) params
     ) suu
WHERE userID = ?;