我有一个包含用户名和结果的表。 当用户将其结果插入数据库时,我想执行将返回的查询 前X个结果(在数据库中的排名),也将得到该用户结果 和他在DB中的排名。 结果应该是这样的:
1名队员4500
2 otherplayer 4100
另外一个人3900 ...134当前玩家140
我已尝试使用union进行查询,但后来我没有获得当前的玩家等级。 任何人的想法?
数据库是MYSQL。
10x很多并且周末很愉快:)
修改
这就是我的尝试:
(选择substr(first_name,1,10)作为first_name,结果 来自top_scores ts WHERE result_date> = NOW() - INTERVAL 1天 限制10) 联盟 (选择substr(first_name,1,10)作为first_name,result 来自top_scores ts 其中first_name ='XXX',结果= 3030);
答案 0 :(得分:1)
根据我在这里阅读的内容:
您的表结构是:
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name | varchar(50) | YES | | NULL | |
| result | int(11) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
表格数据如下:
+---------+--------+
| name | result |
+---------+--------+
| Player1 | 4500 |
| Player2 | 4100 |
| Player3 | 3900 |
| Player4 | 3800 |
| Player5 | 3700 |
| Player6 | 3600 |
| Player7 | 3500 |
| Player8 | 3400 |
+---------+--------+
您希望结果集如下所示:
+------+---------+--------+
| rank | name | result |
+------+---------+--------+
| 1 | Player1 | 4500 |
| 2 | Player2 | 4100 |
| 3 | Player3 | 3900 |
| 4 | Player4 | 3800 |
| 5 | Player5 | 3700 |
| 6 | Player6 | 3600 |
| 7 | Player7 | 3500 |
| 8 | Player8 | 3400 |
+------+---------+--------+
SQL:
set @rank = 0;
select
top_scores.*
from
(select ranks.* from (select @rank:=@rank+1 AS rank, name, result from ranks) ranks) top_scores
where
top_scores.rank <= 5
or (top_scores.result = 3400 and name ='Player8');
这将做你想做的事
答案 1 :(得分:1)
SET X = 0;
SELECT @X:=@X+1 AS rank, username, result
FROM myTable
ORDER BY result DESC
LIMIT 10;
重新评论:
这个怎么样:
SET X = 0;
SELECT ranked.*
FROM (
SELECT @X:=@X+1 AS rank, username, result
FROM myTable
ORDER BY result DESC
) AS ranked
WHERE ranked.rank <= 10 OR username = 'current';
答案 2 :(得分:0)
假设您的表格包含以下列:
playername
score
calculated_rank
您的查询应该类似于:
select calculated_rank,playername, score
from tablename
order by calculated_rank limit 5
答案 3 :(得分:0)
我假设你在这张桌子上有PRIMARY KEY。如果你不这样做,只需创建一个。我的表格结构(因为你没有自己提供)是这样的:
id INTEGER
result INTEGER
first_name VARCHAR
SQL查询应该是这样的:
SELECT @i := @i+1 AS position, first_name, result FROM top_scores, (SELECT @i := 0) t ORDER BY result DESC LIMIT 10 UNION
SELECT (SELECT COUNT(id) FROM top_scores t2 WHERE t2.result > t1.result AND t2.id > t1.id) AS position, first_name, result FROM top_scores t1 WHERE id = LAST_INSERT_ID();
我在子查询中添加了附加条件(“AND t2.id&gt; t1.id”),以防止具有相同结果的多个人具有相同的位置。
编辑:如果您有一些登录系统,最好使用结果保存userid并使用它获取当前用户结果。