Mysql 通过多个类别对表格进行排序
我试图找到一种方法,通过多个类别对人们的分数进行排名。 该表包含每个球员的名单,以及他们参加的活动和他们的得分 查询需要根据每个事件中的得分为每个玩家分配一个等级。事件1和事件2中分配的等级应完全分开 如果该玩家在某个事件中失踪,则应为其分配该类别的玩家总数+1的等级Mysql 通过多个类别对表格进行排序,mysql,sql,ranking,rank,Mysql,Sql,Ranking,Rank,我试图找到一种方法,通过多个类别对人们的分数进行排名。 该表包含每个球员的名单,以及他们参加的活动和他们的得分 查询需要根据每个事件中的得分为每个玩家分配一个等级。事件1和事件2中分配的等级应完全分开 如果该玩家在某个事件中失踪,则应为其分配该类别的玩家总数+1的等级 我可以做一个基本的排名超过1类。这很简单。但我甚至不知道该怎么做 表中的数据 预期收益 注意排名并不密集! 我使用的是MySql 5.7 事实上,我有50多个活动和数百人 这是我排名第一的比赛项目 选择 如果分数=最后一个等级,@
我可以做一个基本的排名超过1类。这很简单。但我甚至不知道该怎么做 表中的数据 预期收益 注意排名并不密集! 我使用的是MySql 5.7 事实上,我有50多个活动和数百人 这是我排名第一的比赛项目 选择 如果分数=最后一个等级,@curRank:=@curRank,@curRank:=@u顺序作为等级, 名称 事件 @_顺序:=@_顺序+1,@_最后排名:=得分 从中选择*从数据库中选择,其中EVENT=$EVENT p, 选择@curRank:=1,@_顺序:=1,@_最后一个等级:=0 r 按等级、姓名排序 此sql语句
Select eventno,Name,rank
From
(Select eventno,Name,
CASE
WHEN @event = eventno THEN @rownum := @rownum + 1
ELSE
@rownum := 1
END as rank,
@event := eventno
From table1 t
JOIN (SELECT @rownum := 0) r
JOIN (SELECT @event := (Select Eventno from table1 Limit 1)) s
ORDER BY t.eventno,t.score) x;
CREATE TABLE table1
(`Name` varchar(6), `Score` int, `Eventno` varchar(7))
INSERT INTO table1
(`Name`, `Score`, `Eventno`)
VALUES
('Kevin', 73, 'Event 1'),
('George', 69, 'Event 1'),
('Henry', 70, 'Event 1'),
('George', 45, 'Event 2'),
('Kevin', 65, 'Event 2'),
('Henry', 65, 'Event 2'),
('Daniel', 50, 'Event 2')
给出以下结果:
eventno Name rank
Event 1 George 1
Event 1 Henry 2
Event 1 Kevin 3
Event 2 George 1
Event 2 Daniel 2
Event 2 Kevin 3
Event 2 Henry 4
7 rows
此sql语句
Select eventno,Name,rank
From
(Select eventno,Name,
CASE
WHEN @event = eventno THEN @rownum := @rownum + 1
ELSE
@rownum := 1
END as rank,
@event := eventno
From table1 t
JOIN (SELECT @rownum := 0) r
JOIN (SELECT @event := (Select Eventno from table1 Limit 1)) s
ORDER BY t.eventno,t.score) x;
CREATE TABLE table1
(`Name` varchar(6), `Score` int, `Eventno` varchar(7))
INSERT INTO table1
(`Name`, `Score`, `Eventno`)
VALUES
('Kevin', 73, 'Event 1'),
('George', 69, 'Event 1'),
('Henry', 70, 'Event 1'),
('George', 45, 'Event 2'),
('Kevin', 65, 'Event 2'),
('Henry', 65, 'Event 2'),
('Daniel', 50, 'Event 2')
给出以下结果:
eventno Name rank
Event 1 George 1
Event 1 Henry 2
Event 1 Kevin 3
Event 2 George 1
Event 2 Daniel 2
Event 2 Kevin 3
Event 2 Henry 4
7 rows
下面的方法避免了不可靠地使用用户变量和高度复杂的查询。它使用临时表并利用MyISAM的“每组自动增量”功能来生成每组的行号。要从行号中获取排名,使用带有MINrow_编号的GROUP BY查询
下面的方法避免了不可靠地使用用户变量和高度复杂的查询。它使用临时表并利用MyISAM的“每组自动增量”功能来生成每组的行号。要从行号中获取排名,使用带有MINrow_编号的GROUP BY查询
到目前为止你试过什么了吗?我可以在一个类别上做一个基本的排名。这很简单请对相应的代码进行编码。是否有用于所有名称的主表?同样检查这个答案,对于一般方法:我添加了代码@PaulSpiegelWhere you handling如果某个玩家在某个事件中失踪,他们应该在代码中被分配一个该类别的玩家总数+1的等级?到目前为止你尝试了什么吗?我可以在1个类别上做一个基本的等级。这很简单请对相应的代码进行编码。是否有用于所有名称的主表?同样检查这个答案,对于一般方法:我添加了代码@PaulSpiegelWhere,如果玩家在某个事件中失踪,你将在代码中为他们分配一个该类别玩家总数+1的等级?
drop temporary table if exists tmp_scores;
create temporary table tmp_scores(
rn int auto_increment,
event varchar(50),
name varchar(50),
score int,
primary key (event, rn)
)engine=myisam;
insert into tmp_scores(event, name, score)
select e.event, n.name, t.score
from (select distinct t.event from mytable t) e
cross join (select distinct t.name from mytable t) n
left join mytable t on t.event = e.event and t.name = n.name
order by e.event, t.score is null, t.score desc;
drop temporary table if exists tmp_rank_by_score;
create temporary table tmp_rank_by_score(
event varchar(50),
score int,
rank int,
primary key (event, rank)
)engine=myisam;
insert into tmp_rank_by_score(event, score, rank)
select event, score, min(rn) as rank
from tmp_scores
group by event, score;
select s.event, s.name, s.score, r.rank
from tmp_scores s
join tmp_rank_by_score r on r.event = s.event and r.score <=> s.score
order by r.event, r.rank;
drop temporary table if exists tmp_rank_by_score;
drop temporary table if exists tmp_scores;
| event | name | score | rank |
| ------- | ------ | ----- | ---- |
| Event 1 | Kevin | 73 | 1 |
| Event 1 | Henry | 70 | 2 |
| Event 1 | George | 69 | 3 |
| Event 1 | Daniel | | 4 |
| Event 2 | Kevin | 65 | 1 |
| Event 2 | Henry | 65 | 1 |
| Event 2 | Daniel | 50 | 3 |
| Event 2 | George | 45 | 4 |