MySQL - 从 "leaderboard" 获取位置

MySQL - Getting a position from a "leaderboard"

我正在尝试构建一个查询,我会在其中获得类似排行榜的结果,然后通过他们的 ID 获取特定玩家在排行榜上的位置,并且仅当玩家 isHere = 'true' (存储在另一个 table).

Table here:

 userID  |  isHere |
--------------------
   2    |   true
--------------------
   1    |   true
--------------------
   3    |   false
--------------------
   4    |   true

Table userdata:

   id   |         data            |
------------------------------------
   2    |   {... "points": 5 ...}
------------------------------------
   1    |   {... "points": 10 ...}
------------------------------------
   3    |   {... "points": 2 ...}
------------------------------------
   4    |   {... "points": 28 ...}

查询:

SET
  @row_number = 0;
SELECT
  *
FROM
  (
  SELECT
    (@row_number := @row_number +1) AS num,
    userdata.id,
    userdata.data
  FROM
    userdata
  INNER JOIN
    here ON userdata.id = here.userID
  WHERE
    here.isHere = 'true'
  ORDER BY
    JSON_EXTRACT(userdata.data,
    '$.points') DESC
) AS t
WHERE
  t.id = 1

num 的 returns 是 1... 因为出于某种原因它按 userID/id 排序。我通过将 WHERE t.id = 设置为 2 进行了双重检查,而不是返回 3,它 returns 2...有人知道我的查询有什么问题吗?

注意: 我确实尝试让列 data 只是一个带有点值的 BIGINT,但同样的问题发生了。这样就消除了 JSON_EXTRACT() 有任何问题(我认为?)

注意 2: 运行 内部查询本身仍然按带有 num 列的 ID 排序,但在 PHPMyAdmin 中正确显示订单(截图:https://gyazo.com/73177e79f4fedd4ec7e09ea0e70a9d2b

所以这是有效的查询:

SET
  @row_number = 0;
SELECT
  *
FROM
  (
  SELECT
    (@row_number := @row_number +1) AS num,
    userdata.id,
    userdata.data
  FROM
    userdata
  INNER JOIN
    (
    SELECT
      userdata.id,
      userdata.data
    FROM
      userdata
    INNER JOIN
      here ON userdata.id = here.userID
    WHERE
      here.isHere = 'true'
    ORDER BY
      JSON_EXTRACT(userdata.data,
      '$.points') DESC
  ) AS t ON userdata.id = t.id
) AS t2
WHERE
  id = ?

需要所有这些的唯一原因是 MySQL 执行部分查询的顺序。就像在数学中按照运算顺序使用括号一样,我在这里使用了 SELECT 语句。