У меня есть следующий запрос, где я пытаюсь получить общее количество голов и общее количество голосов за игрока за карьеру.
SELECT
p.PlayerID,
SUM(s.votes) AS Votes,
SUM(p.Goals) AS TotalGoals
FROM
PlayerDetails p
LEFT JOIN PlayerVotes s ON
p.PlayerID = s.PlayerID AND p.Season = s.Season
WHERE
p.PlayerID = $PlayerID
PlayerDetails table
PlayerID | Season | Round | Goals |
PlayerVotes table
PlayerID | Season | Votes |
Основное различие в данных в таблицах состоит в том, что таблица PlayerDetails содержит данные игрока за сезон по нескольким строкам - например, Фред Смит играет в 10 игр, поэтому для каждой игры есть строка, включающая в себя идентификаторы PlayerID, Season, Round и Goals. Таблица PlayerVotes имеет одну строку для каждого игрока за сезон с общим количеством голосов за этот сезон. Например, в 2017 году Фред Смит получил 10 голосов, поэтому будет один ряд данных PlayerID, Season и Votes.
Запрос возвращает сумму целей для игрока за карьеру, но сумма голосов не там, где почти правильно.
Я попытался удалить AND "p.Season = s.Season" в соединении, но это удваивает цель и подсчитывает количество голосов.
Если я запустил этот базовый запрос в моей таблице PlayerVotes, результат будет таким же, как ожидалось
SELECT PlayerID, SUM(Votes)
FROM PlayerVotes
WHERE PlayerID = $PlayerID
Вы можете попробовать сценарий следующим образом:
SELECT p.PlayerID, SUM(p.Goals) AS Goals, pv.Votes FROM PlayerDetails AS p
LEFT JOIN (
SELECT SUM(ppv.Votes) AS Votes, ppv.PlayerID, ppv.Season FROM PlayerVotes AS ppv
GROUP BY ppv.PlayerID, ppv.Season
) AS pv ON pv.PlayerID = p.PlayerID AND pv.Season = p.Season
WHERE p.PlayerID = $PlayerID;