0

我正在尝试在下表中查找为一支球队参加过不止一场比赛的球员(** 表示私钥),并且很难相信我能提出的最佳查询(如下)是最有效的. 关于如何改进它的想法,以及为什么会非常感激的解释(尝试学习 SQL)

Team (*tid*, name)
Game (*gid*, tid)
Player (*gid*, *name*)

SELECT Team_Name, Player_Name

  FROM (SELECT GID, TID FROM GAME) G
      ,(SELECT NAME AS Player_Name, GID FROM PLAYER) P
      ,(SELECT NAME AS Team_Name, TID FROM TEAM) T

  WHERE (     G.GID = P.GID
          AND Player_Name IN (SELECT P.NAME
                                FROM GAME G
                                    ,PLAYER P
                                WHERE G.GID = P.GID
                                GROUP BY P.NAME
                                HAVING COUNT(P.NAME) > 1)
          AND T.TID = G.TID
        )

  GROUP BY Team_Name, Player_Name
  HAVING COUNT(Player_Name) > 1
  ORDER BY Team_Name
4

1 回答 1

2

您是在询问哪些球员参加过不止一场比赛。

SELECT P.Player_Name
FROM Player P
GROUP BY P.Player_Name
HAVING COUNT(DISTINCT P.GID) > 1

这将返回所有玩过 1 场以上游戏 (GID) 的玩家。

如果您还想 GROUP BY 团队,请执行以下操作:

SELECT P.Player_Name, T.Team_Name
FROM Player P
    JOIN Game G ON P.GID = G.GID
    JOIN Team T ON G.TID = T.TID
GROUP BY P.Player_Name, T.Team_Name
HAVING COUNT(DISTINCT G.GID) > 1

在 Player 表中有 GID 似乎很奇怪。也许拥有一个存储 PlayerId 和 GameId 的 PlayerGames 表会更有意义——更好地进行数据库规范化。Player 表应该只为每个玩家存储一条记录。

还有,球员和球队之间真正的联系是什么。在这种情况下,您是说玩家必须玩游戏,而游戏必须有一个团队(或者一个游戏应该有 2 个或更多团队)。让我们知道您的目标,我们可以帮助您提出最佳选择。

祝你好运。

于 2013-02-05T04:10:36.167 回答