Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-为不同类别选择最高分数_Sql - Fatal编程技术网

SQL-为不同类别选择最高分数

SQL-为不同类别选择最高分数,sql,Sql,假设我有一个包含3个表的db: 玩家(PK id_玩家,姓名…) 锦标赛(PK id_锦标赛,名称…) 游戏(PK id_回合、FK id_锦标赛、FK id_玩家和分数) 运动员参加比赛。名为“游戏”的表格记录了不同比赛中每位球员的得分) 我想创建一个如下所示的视图: torunament_name Winner highest_score Tournament_1 Jones 300 Tournament

假设我有一个包含3个表的db:

  • 玩家(PK id_玩家,姓名…)
  • 锦标赛(PK id_锦标赛,名称…)
  • 游戏(PK id_回合、FK id_锦标赛、FK id_玩家和分数)
运动员参加比赛。名为“游戏”的表格记录了不同比赛中每位球员的得分)

我想创建一个如下所示的视图:

    torunament_name     Winner     highest_score
    Tournament_1        Jones                300
    Tournament_2        White                250
我尝试了不同的方法,但我对sql还是相当陌生的(也不熟悉这个论坛) 我尝试使用union all子句,如:

    select * from (select "Id_player", avg("score") as "Score" from 
    "Game" where "Id_tournament" = '1' group by "Id_player" order by 
    "Score" desc) where rownum <= 1 
    union all
    select * from (select "Id_player", avg("score") as "Score" from 
    "Game" where "Id_tournament" = '2' group by "Id_player" order by 
    "Score" desc) where rownum <= 1;

最终编辑: 好的,如果有人怀疑我使用了豪尔赫·坎波斯的脚本,对它做了一点修改,它就工作了。谢谢大家的帮助。不幸的是,我还不能更新评论,所以我只能通过发帖来感谢。这是最后的剧本:

select
   t.name, 
   p.name as winner, 
   g.score
from
   game g inner join tournaments t
           on g.id_tournament = t.id_tournament
          inner join players p
           on g.id_player = p.id_player
          inner join 
              (select g.id_tournament, g.id_player,
                      row_number() over (partition by t.name order by 
    score desc) as rd from game g join tournaments t on 
    g.id_tournament = t.id_tournament
          ) a
       on g.id_player = a.id_player
          and g.id_tournament = a.id_tournament
          and a.rd=1
order by t.name, g.score desc;
假设您想要的是“在每项比赛中显示每位球员的高分” 在MS Sql server中,您的查询如下所示

select 
        t.name as tournament_name,
        p.name as Winner,
        Max(g.score) as [Highest_Score]
from Tournmanents t
Inner join Game g on t.id_tournament=g.id_tournament
inner join Players p on p.id_player=g.id_player
group by 
g.id_tournament,
g.id_player,
t.name,
p.name

根据您使用的RDBMs,可以简化此查询

select
   t.name, 
   p.name as winner, 
   g.score
from
   game g inner join tournaments t
           on g.id_tournament = t.id_tournament
          inner join players p
           on g.id_player = p.id_player
          inner join 
              (select id_tournament, 
                      id_player,
                      row_number() over (partition by t.name order by score desc) as rd
                 from game
              ) a
           on g.id_player = a.id_player
              and g.id_tournament = a.id_tournament
              and a.rd=1
order by t.name, g.score desc

如果这对你有用,请检查这个

SELECT  tournemntData.id_tournament ,
        tournemntData.name ,
        dbo.Players.name ,
        tournemntData.Score
FROM    dbo.Game
        INNER JOIN ( SELECT dbo.Tournaments.id_tournament ,
                            dbo.Tournaments.name ,
                            MAX(dbo.Game.score) AS Score
                     FROM   dbo.Game
                            INNER JOIN dbo.Tournaments ONTournaments.id_tournament = Game.id_tournament
                            INNER JOIN dbo.Players ON Players.id_player = Game.id_player
                     GROUP BY dbo.Tournaments.id_tournament ,
                            dbo.Tournaments.name
                   ) tournemntData ON tournemntData.id_tournament =Game.id_tournament 

INNER JOIN dbo.Players ON Players.id_player = Game.id_player
WHERE tournemntData.Score = dbo.Game.score

你的RDBMs是什么?如果一场比赛有多场比赛怎么办?您的查询不包括这种情况。无论是哪场比赛,对于每一场比赛,我的查询都会为每位球员提供最高分数。这就是问题的框架。你不明白我的意思,如果你有一个t1(作为锦标赛1),有两个游戏作为g1和g2,并且玩家a,你的查询将为同一个锦标赛两次获取玩家a。我知道OP并没有明确说明这一点,我只是认为最好是每个球员都有一场比赛,以达到他想要的结果。不要说你的问题是错误的。在这种情况下,您必须汇总t1的所有结果,而不是显示它的所有结果。我并没有按游戏id分组。所以我的查询会为玩家玩的每个单独的锦标赛抽取每个玩家的最大(分数)。我也明白你的意思。谢谢你的回答。我想我没有把所有的东西都放在我的第一篇文章里。所以让我们假设id为1的玩家在锦标赛a中得了50分,玩家2得了40分,玩家1获胜,因此表中应该只显示玩家1为本次锦标赛的赢家(如果可能的话,则显示2名或更多的玩家,如果是平手)。下一行显示第二届锦标赛的获胜者。我不认为我会在同一场比赛中为一名球员安排多场比赛,但如果我愿意,我可能会从他的所有得分中计算平均得分。你能帮忙吗?你的数据库系统是什么?Mysql、sqlserver、oracle、postgresql?oracle。我将在Application Express中使用此选项来显示基于此select语句的简单报告。我已更改了答案。“ORA-00923:FROM关键字未找到预期位置”我正在检查它在Oracle SqlDeveloper中是否有效我编辑了我的第一篇文章,以便向您提供更多信息
SELECT  tournemntData.id_tournament ,
        tournemntData.name ,
        dbo.Players.name ,
        tournemntData.Score
FROM    dbo.Game
        INNER JOIN ( SELECT dbo.Tournaments.id_tournament ,
                            dbo.Tournaments.name ,
                            MAX(dbo.Game.score) AS Score
                     FROM   dbo.Game
                            INNER JOIN dbo.Tournaments ONTournaments.id_tournament = Game.id_tournament
                            INNER JOIN dbo.Players ON Players.id_player = Game.id_player
                     GROUP BY dbo.Tournaments.id_tournament ,
                            dbo.Tournaments.name
                   ) tournemntData ON tournemntData.id_tournament =Game.id_tournament 

INNER JOIN dbo.Players ON Players.id_player = Game.id_player
WHERE tournemntData.Score = dbo.Game.score