获得参加国际或全国比赛最多比赛的球员?

时间:2013-11-23 14:12:42

标签: sql oracle

   SELECT * 
     From (
           SELECT Count(Player_Score_Record.Player_ID) AS TotalC, 
                  Player.First_Name
             FROM Player 
            INNER JOIN (Match INNER JOIN Player_Score_Record 
                        ON Match.Match_ID = Player_Score_Record.Match_ID) 
               ON Player.Player_ID = Player_Score_Record.Player_ID 
            WHERE (Match.M_Type='International' Or Match.M_Type='National')
            GROUP BY Player.First_Name
            ORDER BY Count(Player_Score_Record.Player_ID) DESC
           ) A
    Where A.TotalC = 3 ;

我曾尝试Max(Count(Player_Score_Record.Player_ID) As TotalC - 它也显示错误。

最新的尝试是使用WHERE A.TotalC = (SELECT Max(TotalC) From A);。它显示

  

ORA-00942:表或视图不存在。

所以我只能直接指定3的数量(加入的最大匹配数)。

2 个答案:

答案 0 :(得分:0)

我不确定你是否只想要:

  • 根据比赛次数排序的球员名单。

  • 与玩过更多比赛的玩家一起玩过多次比赛的玩家列表。

无论如何,您可以尝试以下任一解决方案。请注意这些SQL语句未经测试,因为我目前无权访问数据库。


如果是选项1,您可以使用以下SQL:

select Player.first_name, player_matches.player_id, player_matches.total_played
  from (
        select Player_ID, count(Match_ID) TotalPlayed
          from Player_Score_Record
          join Match
            on Match.Match_ID = Player_Score_Record.Match_ID 
         where (Match.M_Type='International' Or Match.M_Type='National')
         group by Player_ID
      ) player_matches
  join Player on player_matches.player_id = player.player_id
 order by player_matches.total_played desc

我们在此选择中所做的是:

  1. 首先我们得到Player_ID的列表以及玩家所玩的匹配数。
  2. 然后我们与Player一起加入,以获取我们想要的更多数据。
  3. 最后我们点了它。您可能希望在此处按total_played进行过滤。

  4. 另一方面,如果您想要尝试遵循SQL,则选项2是

    select Player.first_name, Player_ID, count(Match_ID) TotalPlayed
      from Player_Score_Record 
      join Player
        on Player_Score_Record.player_id = player.player_id
     group by Player_ID 
     having count(Match_ID) = (
                                select max(total_played)
                                  from (
                                         select Player_ID, count(Match_ID) TotalPlayed
                                           from Player_Score_Record
                                           join Match
                                             on Match.Match_ID = Player_Score_Record.Match_ID 
                                          where (Match.M_Type='International' Or Match.M_Type='National')
                                          group by Player_ID
                                       )
    

    我们在此选择中所做的是:

    1. 首先我们得到Player_ID的列表以及玩家所玩的匹配数。
    2. 然后我们提取任何玩家的最大比赛数。
    3. 最后,我们会获得播放了最多匹配数的玩家的玩家信息。

答案 1 :(得分:0)

这里有两个选项:

  • 查询1:如果您想要所有Player_ID个玩家玩游戏次数最多的玩家;或
  • 查询2:如果您只想要一个玩过最多游戏的玩家。

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE Player
(
  Player_ID  PRIMARY KEY,
  First_Name
) AS
          SELECT 1, 'A' FROM DUAL
UNION ALL SELECT 2, 'A' FROM DUAL
UNION ALL SELECT 3, 'A' FROM DUAL;

CREATE TABLE Match
(
  Match_ID PRIMARY KEY,
  M_Type
) AS
          SELECT 1, 'National' FROM DUAL
UNION ALL SELECT 2, 'International' FROM DUAL
UNION ALL SELECT 3, 'League' FROM DUAL;

CREATE TABLE Player_Score_Record
(
  Player_ID NUMBER(1),
  Match_ID  NUMBER(1),
  PRIMARY KEY (Player_ID, Match_ID),
  FOREIGN KEY (Player_ID) REFERENCES Player (Player_ID),
  FOREIGN KEY (Match_ID) REFERENCES Match (Match_ID)
);

INSERT INTO Player_Score_Record
          SELECT 1,1 FROM DUAL
UNION ALL SELECT 1,2 FROM DUAL
UNION ALL SELECT 2,1 FROM DUAL
UNION ALL SELECT 2,2 FROM DUAL
UNION ALL SELECT 2,3 FROM DUAL
UNION ALL SELECT 3,2 FROM DUAL
UNION ALL SELECT 3,3 FROM DUAL;

查询1

WITH num_games AS (
  SELECT r.Player_ID, COUNT(1) AS number_of_games_played
  FROM   Player_Score_Record r
         INNER JOIN
         Match m
         ON (r.Match_ID = m.Match_ID)
  WHERE  m.M_Type IN ( 'National', 'International' )
  GROUP BY r.Player_ID
)
SELECT Player_ID
FROM   num_games
WHERE  number_of_games_played = (SELECT MAX(number_of_games_played)
                                 FROM   num_games)

<强> Results

| PLAYER_ID |
|-----------|
|         1 |
|         2 |

查询2

WITH num_games AS (
  SELECT r.Player_ID, COUNT(1) AS number_of_games_played
  FROM   Player_Score_Record r
         INNER JOIN
         Match m
         ON (r.Match_ID = m.Match_ID)
  WHERE  m.M_Type IN ( 'National', 'International' )
  GROUP BY r.Player_ID
  ORDER BY number_of_games_played DESC, r.Player_ID
)
SELECT Player_ID
FROM   num_games
WHERE  ROWNUM = 1

<强> Results

| PLAYER_ID |
|-----------|
|         1 |