私はサッカーマネジメントゲームの情報を含む一連のMySQLテーブルを持っています。MySQL maxを使用した詳細の選択
テーブルは、次のとおり
- プレーヤー - playerID(PK)、プレイヤー名
- マッチ - matchID(PK)、matchSeason、matchRound、matchType
- PlayersMatch - playerID、matchID(コンプPK) matchRating、playerForm、playerAge、position(nullも可)
これらの表に格納されているデータは、プレーヤーのパフォーマンスに関連しています。選手は試合でプレーし、定格性能を持つ(matchRating)。プレイヤーが参加している各試合のプレイヤーマッチには、プレーヤーの現在の形式を記録し、試合の時点でのマッチ(過去の目的で)とプレイした位置が記録されます。
現在、現在、私はシーズン全体のトップ10選手をリストするには、次のクエリを使用しています(ラウンドあたりの最高のパフォーマンスではなく、全体としてシーズンで最高の性能):
SELECT playerID, matchID, playerForm, playerAge, MAX(matchRating)
FROM PlayersMatch
INNER JOIN Matches ON PlayersMatch.matchID = Matches.matchID
WHERE Matches.matchSeason = 35
AND Matches.matchType = 'L'
AND PlayersMatch.position IS NOT NULL
GROUP BY PlayersMatch.playerID
ORDER BY MAX(matchRating) DESC, playerForm ASC
私は取得しています問題は、しばらくです私は正しいplayerIDとplayer matchRatingを得ています。間違ったmatchID、フォーム、年齢、その他の情報を取得しています(つまり、他のレコードのものです)。
私は正しい情報を得ている間にグループにmatchIDを追加しようとしましたが、playerIDとmatchIDがPlayersMatchのPKを構成するため、プレーヤのために重複したレコードを作成したため重複していました。
あなたのご支援をよろしくお願いいたします。
編集:、さらにいくつか読んだ後、私は間違ってSQLを記述しなければならないとすることによりグループは、私はちょうどplayerIDとmax(matchRating)を持っている場合は、正しい情報を返すために起こっていること - 最低であることをANSI SQLが正しい。
その場合、max/group byを使用している場合、そのパフォーマンスの対応する一致の詳細を取得するにはどうすればよいですか?
編集2:
SELECT * FROM PlayersMatch
INNER JOIN
(SELECT playerID, MAX(matchRating)
FROM PlayersMatch p2
JOIN Matches
ON p2.matchID = Matches.matchID
WHERE matchSeason = 35
AND matchType = 'L'
AND p2.position IS NOT NULL
GROUP BY p2.playerID) AS p1
ON PlayersMatch.playerID = p1.playerID
AND PlayersMatch.matchRating = p1.matchRating
JOIN Matches m2
ON PlayersMatch.matchID = m2.matchID
WHERE m2.matchSeason = 35
AND m2.matchType = 'L'
AND PlayersMatch.position IS NOT NULL
ORDER BY matchRating DESC
唯一の問題は、今、それが実行に21秒かかるということである:私は作業のクエリを持っているように見えます。このクエリは正しいか?
私は、トップパフォーマー全体でMAX(マッチレーティング)を使用することに同意しません。 AVGを使用するべきではありませんか?一例として、第1位は10位、第2位は2位(平均6)、プレーヤーBは2位(8,8(平均8))であった。しかし、あなたの計算は、プレーヤーAを最高のパフォーマーにするでしょう。 – ajreal
@ajreal、提案のおかげで、平均的な評価は私が表示しようとしているものではありません。私は平均のために1つを追加するかもしれませんが、この時点では最大値が必要です。しかし、私の問題は解決しません。 :P – Cyntech
あなたはplayerIdとmatchRatingで参加しているわけではありませんが、それは一意であることは保証されていません(matchIdである必要があります)。適切なインデックス(matchRating、おそらくmatchSeason、matchType、およびposition)を作成しましたか? 'explain'を使用して、なぜそれが長くかかるのかを確認してください。 – Inca