Mysql 通过多个类别对表格进行排序

Mysql 通过多个类别对表格进行排序,mysql,sql,ranking,rank,Mysql,Sql,Ranking,Rank,我试图找到一种方法,通过多个类别对人们的分数进行排名。 该表包含每个球员的名单,以及他们参加的活动和他们的得分 查询需要根据每个事件中的得分为每个玩家分配一个等级。事件1和事件2中分配的等级应完全分开 如果该玩家在某个事件中失踪,则应为其分配该类别的玩家总数+1的等级 我可以做一个基本的排名超过1类。这很简单。但我甚至不知道该怎么做 表中的数据 预期收益 注意排名并不密集! 我使用的是MySql 5.7 事实上,我有50多个活动和数百人 这是我排名第一的比赛项目 选择 如果分数=最后一个等级,@

我试图找到一种方法,通过多个类别对人们的分数进行排名。 该表包含每个球员的名单,以及他们参加的活动和他们的得分

查询需要根据每个事件中的得分为每个玩家分配一个等级。事件1和事件2中分配的等级应完全分开

如果该玩家在某个事件中失踪,则应为其分配该类别的玩家总数+1的等级


我可以做一个基本的排名超过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    |