mysql-从“排行榜”中获得职位

lrl1mhuk  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(246)

我试图构造一个查询,在那里我会得到一个类似排行榜的结果,然后得到一个特定玩家在排行榜上的位置,根据他们的id,并且只有当玩家 isHere = 'true' (存储在另一个表中)。
here :

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

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 是1。。。因为出于某种原因,它是按userid/id排序的 WHERE t.id = 它不是返回3,而是返回2。。。有人知道我的问题是什么吗?
注意:我确实试过写专栏 data 只是一个 BIGINT 但同样的问题也发生了。这样就消除了 JSON_EXTRACT() 有什么问题吗(我想?)
注意2:在自己的still orders上运行内部查询 num 列,但在phpmyadmin中以正确的顺序显示(屏幕截图:https://gyazo.com/73177e79f4fedd4ec7e09ea0e70a9d2b)

pbpqsu0x

pbpqsu0x1#

以下是有效的查询:

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 这里是声明。

相关问题