SQL JOIN COUNT и GROUP BY - PullRequest
0 голосов
/ 28 мая 2018

У меня есть три стола
1. players(id, first_name, last_name, age, position, team_id) 2. teams(id, team_name, stadium, wins, draws,defeats,goal_for,goal_against) 3. goals_scored(id, player_id, goal_time)

оператор SQL

SELECT
    players.first_name, 
    players.last_name,
    teams.name, 
    players.position, 
    players.age, 
    COUNT(*) AS goals 
FROM 
    players 
JOIN goals_scored
    ON players.id = goals_scored.player_id 
JOIN teams 
    ON players.team_id = teams.id 
GROUP BY players.id;

стол команд
id team_name stadium wins draws defeats goal_for goal_against 1 APF Club Dasharath 7 2 7 29 25

стол игроков
id first_name last_name position age team_id 4 Dipendra Shrestha forward 19 1

таблица целей с подсчетом очков
id player_id goal_time 1 4 34 2 4 57

Я хочу сгруппировать голы по идентификаторам игроков, чтобы получить количество голов для отдельного игрока.Как
first_name last_name team_name position age goals Dipendra Shrestha APF Club forward 19 2

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Предпочитайте группировать по как можно меньшему количеству столбцов, особенно если задействовано несколько таблиц, чтобы можно было применить хороший индекс для обработки группы:

WITH GoalsPerPlayer (playerId, nrOfGoals)
AS 
(
    SELECT player_id, count(*)
    FROM goals_scored 
    GROUP BY player_id
)
SELECT p.first_name, p.last_name, t.team_name, p.position, p.age, g.numberOfGoals as goals
FROM GoalsPerPlayer g
INNER JOIN players p ON p.id = g.player_id
INNER JOIN teams t ON t.id = p.team_id

Редактировать:

Исправлены опечатки в запросе, как указано PO в комментарии ниже.

WITH GoalsPerPlayer (playerId, nrOfGoals)
AS 
(
    SELECT player_id, count(*)
    FROM goals_scored 
    GROUP BY player_id
)
SELECT p.first_name, p.last_name, t.team_name, p.position, p.age, g.nrOfGoals as goals
FROM GoalsPerPlayer g
INNER JOIN players p ON p.id = g.playerId
INNER JOIN teams t ON t.id = p.team_id
0 голосов
/ 28 мая 2018

Ваш запрос в основном выглядит нормально.Я бы отрегулировал GROUP BY чтобы быть более полным:

SELECT p.first_name, p.last_name, t.name, p.position, p.age, 
       COUNT(*) AS goals 
FROM players p JOIN
     goals_scored gs
     ON p.id = gs.player_id JOIN
     teams t
     ON p.team_id = t.id 
GROUP BY p.first_name, p.last_name, t.name, p.position, p.age;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...