在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