MySQL 将记录数限制为一列中的 5 个唯一值
MySQL Limit number of records to 5 unique values in one column
我正在尝试根据游戏中的击杀数创建排行榜,其中显示排名前 5 位的玩家(击杀数相同的人处于同一等级)。
我如何获取所有记录直到排名 5 位置(所有记录直到列中最多 5 个唯一值(杀死))。
我希望这是有道理的。
查询还需要考虑地图。例如:WHERE map = 'map_name'
例如:
Table:
Name, Map, Kills
user0 - map2 - 30
user1 - map1 - 30
user2 - map1 - 27
user3 - map1 - 54
user4 - map1 - 34
user5 - map1 - 34
user6 - map1 - 27
user7 - map1 - 22
user8 - map1 - 22
user9 - map1 - 31
user10 - map1 - 21
user11 - map1 - 27
user12 - map2 - 34
需要结果(地图名称 map1 排名前 5 的所有玩家/记录):
1. user3 - 54
2. user4 - 34
user5 - 34
3. user9 - 31
4. user1 - 30
5. user2 - 27
user6 - 27
user11 - 27
到目前为止我有:SELECT * FROM
记录WHERE
地图= 'map1' ORDER BY
杀戮DESC
但我需要将返回的行数限制为 top 5 ranks
所需的数量,而不是所有行。
试试这个查询:
SELECT * FROM records WHERE
map = 'map1' and kills in (SELECT * FROM
(select Kills from records where map = 'map1' group by Kills order by kills desc limit 0,5)
as x) order by Kills desc
以下是没有 top/limit 功能的方法:
SELECT ... FROM T t
WHERE t.map = ? AND t.kills <= (
select max(t2.kills) from T t2
where t2.map = t.map and (
select count(distinct t3.kills) from T t3
where t3.map = t2.map and t3.kills <= t2.kills
) <= 5
)
我正在尝试根据游戏中的击杀数创建排行榜,其中显示排名前 5 位的玩家(击杀数相同的人处于同一等级)。
我如何获取所有记录直到排名 5 位置(所有记录直到列中最多 5 个唯一值(杀死))。
我希望这是有道理的。
查询还需要考虑地图。例如:WHERE map = 'map_name'
例如:
Table:
Name, Map, Kills
user0 - map2 - 30
user1 - map1 - 30
user2 - map1 - 27
user3 - map1 - 54
user4 - map1 - 34
user5 - map1 - 34
user6 - map1 - 27
user7 - map1 - 22
user8 - map1 - 22
user9 - map1 - 31
user10 - map1 - 21
user11 - map1 - 27
user12 - map2 - 34
需要结果(地图名称 map1 排名前 5 的所有玩家/记录):
1. user3 - 54
2. user4 - 34
user5 - 34
3. user9 - 31
4. user1 - 30
5. user2 - 27
user6 - 27
user11 - 27
到目前为止我有:SELECT * FROM
记录WHERE
地图= 'map1' ORDER BY
杀戮DESC
但我需要将返回的行数限制为 top 5 ranks
所需的数量,而不是所有行。
试试这个查询:
SELECT * FROM records WHERE
map = 'map1' and kills in (SELECT * FROM
(select Kills from records where map = 'map1' group by Kills order by kills desc limit 0,5)
as x) order by Kills desc
以下是没有 top/limit 功能的方法:
SELECT ... FROM T t
WHERE t.map = ? AND t.kills <= (
select max(t2.kills) from T t2
where t2.map = t.map and (
select count(distinct t3.kills) from T t3
where t3.map = t2.map and t3.kills <= t2.kills
) <= 5
)