У меня есть набор таблиц MySQL, содержащих информацию из футбольной игры.
Таблицы:
- Players - playerID (PK), playerName
- Совпадения - matchID (PK), matchSeason, matchRound, matchType
- PlayersMatch - playerID, matchID (comp PK), matchRating, playerForm, playerAge, позиция (может быть нулевой)
Данные, хранящиеся в этих таблицах, связаны с игрой игрока. Игрок играет в матче и имеет оценку производительности (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 составляют PK в PlayersMatch).
Ваша помощь в этом очень ценится.
Редактировать: После некоторого прочтения я должен написать 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 секунда. Этот запрос выглядит правильно?