我有一套包含足球管理游戏信息的MySQL表。MySQL使用max选择细节
的表是:
- 选手 - playerID(PK),playerName
- 相配 - matchID(PK),matchSeason,matchRound,使用MatchType
- PlayersMatch - playerID,matchID(化合物PK), matchRating,playerForm,playerAge,position(可以为null)
存储在这些表中的数据与玩家的表现有关。玩家在比赛中进行比赛并且具有额定表现(matchRating)。 PlayersMatch中记录了玩家参与的每场比赛,记录了玩家当前的形式,比赛成绩,比赛时的年龄(用于历史目的)以及他们所玩的位置。
现在, ,我使用下面的查询,列出从整个赛季的前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
我得到的问题是,虽然我得到正确的玩家ID和玩家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(matchRating)作为整体表现最佳。它不应该使用AVG吗?举例来说,玩家A打了两场比赛,第一场评分为10,第二场评分为2(Avg 6),玩家B打了两场比赛,评分为8,8(Avg 8)。但是你的计算会让玩家A成为最佳表现者。 – ajreal
@ajreal,感谢您的建议,但平均评分不是我想要展示的。我可能会添加一个平均,但在这一点上,我只需要最大。尽管如此,仍然没有解决我的问题。 :P – Cyntech
并非完全:您加入playerId和matchRating,但这并不保证是唯一的(应为matchId)。你是否创建了适当的索引(matchRating,可能matchSeason,matchType和position)。使用'explain'来看看它为什么花费这么长时间。 – Inca