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

これにより、複数のゲーム (GID) でプレイしたすべてのプレーヤーが返されます。

GROUP BY team も行いたい場合は、次のようにします。

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 があるのは奇妙に思えます。おそらく、PlayerGames テーブルを持つ方が、PlayerId と GameId を格納する方が理にかなっており、データベースの正規化に適しています。Player テーブルには、プレーヤーごとに 1 つのレコードのみを格納する必要があります。

また、選手とチームの本当の関係とは。このシナリオでは、プレーヤーがゲームをプレイする必要があり、ゲームにはチームが必要です (または、ゲームに 2 つ以上のチームが必要です)。ご希望をお知らせください。最適なオプションをご提案いたします。

幸運を。

于 2013-02-05T04:10:36.167 に答える