在mysql中显示绝对计数器

在mysql中显示绝对计数器,mysql,sql,Mysql,Sql,我有这种关系: ╔═══════════════════╗ ║ i++ name score ║ ╠═══════════════════╣ ║ 1 Will 123 ║ ║ 2 Joe 100 ║ ║ 3 Bill 99 ║ ║ 4 Max 89 ║ ║ 5 Jan 43 ║ ║ 6 Susi 42 ║ ║ 7 Chris 11 ║ ║ 8 Noa 9 ║

我有这种关系:

╔═══════════════════╗
║ i++ name  score   ║
╠═══════════════════╣
║ 1   Will  123     ║
║ 2   Joe   100     ║
║ 3   Bill  99      ║
║ 4   Max   89      ║
║ 5   Jan   43      ║
║ 6   Susi  42      ║
║ 7   Chris 11      ║
║ 8   Noa   9       ║
║ 9   Sisi  4       ║
╚═══════════════════╝
使用此sql:

set @username = ?;
set @uuid = ?;
SELECT * FROM (
    -- Get those who scored worse (or tied)
    (    SELECT s.*
           FROM quiz.score s
     CROSS JOIN (SELECT points FROM quiz.score WHERE username = @username) and uuid=@uuid ref
          WHERE s.points <= ref.points AND username <> @username
       ORDER BY s.points DESC
          LIMIT 2)
    UNION
    -- Get our reference point record
    (SELECT s.* FROM quiz.score s WHERE username = @username and uuid=@uuid)
    UNION
    -- Get those who scored better
    (    SELECT s.*
           FROM quiz.score s
     CROSS JOIN (SELECT points FROM quiz.score WHERE username = @username and uuid=@uuid) ref
          WHERE s.points > ref.points AND username <> @username
       ORDER BY s.points ASC
          LIMIT 2)
) slice
ORDER BY points ASC;
但我需要这样的结果:

╔═══════════════════╗
║ id++ name score   ║
╠═══════════════════╣
║ 3   Bill  99      ║
║ 4   Max   89      ║
║ 5   Jan   43      ║
║ 6   Susi  42      ║
║ 7   Chris 11      ║
╚═══════════════════╝
我需要一个迭代器列,用于计算已建立行在整个表中的绝对位置。
您知道我如何处理此问题吗?

这将比您的查询运行得快得多:

SELECT @rankOfSearch := count(*) FROM t
WHERE score >= (
  SELECT score FROM t
  WHERE id = 5
)
ORDER BY score DESC;

SELECT id, name, score FROM (
  SELECT t.*, @rank := @rank + 1 rank
  FROM t, (SELECT @rank := 0) init
  ORDER BY score DESC
) s
WHERE rank BETWEEN @rankOfSearch - 2 AND @rankOfSearch + 2
ORDER BY rank
输出:

| ID |  NAME | SCORE |
|----|-------|-------|
|  3 |  Bill |    99 |
|  4 |   Max |    89 |
|  5 |   Jan |    43 |
|  6 |  Susi |    42 |
|  7 | Chris |    11 |

只需确保将id=5替换为您当前(或将来可能会有的)查找“中间”记录的任何方式即可。

如果分数始终与id相关,则可以使用以下方法:

SET middle = 5
SET max = middle + 2;
SET min = middle - 2;

SELECT *
FROM quiz_score
WHERE id BETWEEN min AND max

你能用一句话说出你想要达到的目标吗?+1表示漂亮的ascii艺术表格。我正在努力获得在线高分。高分可以通过用户名和uuid识别。使用问题中的sql,我能够显示数千个条目的子视图。不幸的是,我想显示用户的当前分数。这就是问题所在。如何显示基于子视图中所有行的分数?@Mosty Mostacho让我们假设我有100000个条目。我不确定是应该用mysql还是用java在服务器端创建子视图。我正在寻找一个没有高性能风险的解决方案。我在回答您的问题时没有这样做吗?
SET middle = 5
SET max = middle + 2;
SET min = middle - 2;

SELECT *
FROM quiz_score
WHERE id BETWEEN min AND max