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
语句。
我正在尝试构建一个查询,我会在其中获得类似排行榜的结果,然后通过他们的 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
语句。