gpt4 book ai didi

MySQL - 从 "leaderboard"获取位置

转载 作者:行者123 更新时间:2023-11-29 10:09:19 28 4
gpt4 key购买 nike

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

此处:

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

用户数据:

   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 = 设置为 2 进行了双重检查,结果不是返回 3,而是返回 2...有人知道我的查询出了什么问题吗?

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

注释 2: 单独运行内部查询仍然按 ID 与 num 列进行排序,但以正确的顺序显示在 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 语句。

关于MySQL - 从 "leaderboard"获取位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51297299/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com