我有一张名为积分榜的桌子,每个队都有积分,净胜球和进球。这是表结构和数据。
CREATE TABLE standings (
team_id int(3) unsigned NOT NULL AUTO_INCREMENT,
points int(2) unsigned DEFAULT 0,
goal_difference int(2) unsigned DEFAULT 0,
goals_for int(2) unsigned DEFAULT 0,
PRIMARY KEY (team_id)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
insert into standings(team_id,points,goal_difference,goals_for) values (1,20,2,17);
insert into standings(team_id,points,goal_difference,goals_for) values (2,14,8,15);
insert into standings(team_id,points,goal_difference,goals_for) values (3,9,2,11);
insert into standings(team_id,points,goal_difference,goals_for) values (4,14,10,12);
insert into standings(team_id,points,goal_difference,goals_for) values (5,17,10,19);
insert into standings(team_id,points,goal_difference,goals_for) values (6,5,-11,7);
insert into standings(team_id,points,goal_difference,goals_for) values (7,14,10,10);
insert into standings(team_id,points,goal_difference,goals_for) values (8,9,2,14);
insert into standings(team_id,points,goal_difference,goals_for) values (9,12,1,10);
insert into standings(team_id,points,goal_difference,goals_for) values (10,9,2,14);
commit;
我想按照points,goal_difference和goals_for的降序对此表进行排序,并根据此顺序为每个团队分配排名。由于mySQL没有RANK功能,在搜索这个网站之后我来了 这个查询。
SELECT CASE
WHEN @prev_value = concat(points,'-',goal_difference,'-',goals_for)
THEN
@cur_rank
WHEN @prev_value := concat(points,'-',goal_difference,'-',goals_for)
THEN
@cur_rank := @cur_rank + 1
END
AS rank, s.team_id, s.points, s.goal_difference, s.goals_for
FROM standings s, (SELECT @cur_rank := 0) p, (SELECT @prev_rank := 0) q, (SELECT @prev_value := NULL) r
ORDER BY s.points DESC, s.goal_difference DESC, s.goals_for DESC;
到目前为止一切顺利。现在我有两个问题。
我想使用此查询创建一个VIEW。但mySQL不让我创建一个并给出错误,'View的SELECT包含一个变量或参数'。请建议如何为此创建VIEW。
CREATE VIEW view_standings
AS
SELECT CASE
WHEN @prev_value = concat(points,'-',goal_difference,'-',goals_for)
THEN
@cur_rank
WHEN @prev_value := concat(points,'-',goal_difference,'-',goals_for)
THEN
@cur_rank := @cur_rank + 1
END
AS rank,s.team_id,s.points,s.goal_difference,s.goals_for
FROM standings s,(SELECT @cur_rank := 0) p,(SELECT @prev_rank := 0) q,(SELECT @prev_value := NULL) r
ORDER BY s.points DESC, s.goal_difference DESC, s.goals_for DESC;
答案 0 :(得分:2)
您还可以使用相关子查询进行排名。如果你有相当数量的数据,这可能是计算密集型的。
select s.*,
(select 1+COUNT(*)
from standings s2
where s2.points > s.points or
(s2.points = s.points and s2.goal_difference > s.goal_difference) or
(s2.points = s.points and s2.goal_difference = s.goal_difference and s2.goals_for > sys.goals_for
) as ranking
from standings s
因为from
子句中只有子查询,所以可以将其用作视图。
我认为您可以通过索引号standings(points, goal_difference, goals_for)
来提高效果。