我的查询有问题。我想从我的排名查询中选择数据。 我的查询输出是Perfect Like:
------------------------------
Rank | ID | Username | Value
-------------------------------
1 | 5 | Julian | 5000
2 | 2 | Masha | 2400
3 | 4 | Misha | 2300
4 | 1 | Jackson | 1900
5 | 9 | Beruang | 400
-------------------------------
但是当我选择ID = 4时,输出如下:
------------------------------
Rank | ID | Username | Value
-------------------------------
***1*** | 4 | Misha | 2300
-------------------------------
排名的输出是1而不是3。
我的查询是:
SELECT @curRank := @curRank + 1 AS rank,
a.id, a.username
FROM partimer a CROSS JOIN
(SELECT @curRank := 0) vars
# WHERE a.id = 4
ORDER By id;
答案 0 :(得分:0)
如果Rank
是动态计算的,你可以这样做:
SELECT *
FROM (
SELECT @curRank := @curRank + 1 AS rank
, a.id
, a.username
FROM partimer a
CROSS JOIN (SELECT @curRank := 0) vars
ORDER BY value
) p
WHERE p.id = 4;
这样,您可以存储具有排名的临时表,然后从中进行选择。
答案 1 :(得分:0)
你应该喜欢这个
SELECT *
FROM (
...{your Query}...
) qry
WHERE qry.id = 4
答案 2 :(得分:0)
您的排名是在查询中动态计算的。这里的问题是这些动态计算在之后应用于where子句。换句话说,当MySQL执行您的查询时,它首先过滤掉所有符合where
子句的行,然后才应用排名计算。在给定查询中,id=4
行确实是遵循where子句的所有行之间的第1行。
获得所需行为的一种方法是首先执行原始查询,然后使用此查询作为子查询并将where
子句应用于外部查询来过滤结果:
SELECT *
FROM (SELECT @curRank := @curRank + 1 AS rank, a.id, a.username
FROM partimer a
CROSS JOIN (SELECT @curRank := 0) vars
ORDER By id) t
WHERE id = 4