我试图构造一个查询,在那里我会得到一个类似排行榜的结果,然后得到一个特定玩家在排行榜上的位置,根据他们的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)
1条答案
按热度按时间pbpqsu0x1#
以下是有效的查询:
之所以需要这样做,唯一的原因是mysql执行部分查询的顺序。就像数学中括号是按运算顺序使用的一样,我使用了
SELECT
这里是声明。