Этот запрос будет выполняться на MySQL 5.x. Он использует переменные MySQL для эмуляции функции ROW_NUMBER
. Если вы используете MySQL 8+, я бы порекомендовал второй запрос, поскольку переменные в MySQL 8 устарели и могут быть удалены в будущих версиях.
SELECT *,
@rank := @rank + 1 AS position
FROM (
SELECT team,
SUM(points) AS points,
SUM(goals_for) AS goals_for,
SUM(goals_against) AS goals_against
FROM (
SELECT team1 AS team,
CASE WHEN m.result_team_1 > m.result_team_2 THEN 3
WHEN m.result_team_1 = m.result_team_2 THEN 1
ELSE 0 END AS points,
m.result_team_1 AS goals_for,
m.result_team_2 AS goals_against
FROM matches m
UNION ALL
SELECT team2 AS team,
CASE WHEN m.result_team_2 > m.result_team_1 THEN 3
WHEN m.result_team_2 = m.result_team_1 THEN 1
ELSE 0 END AS points,
m.result_team_2 AS goals_for,
m.result_team_1 AS goals_against
FROM matches m
) r
GROUP BY team
ORDER BY points DESC, SUM(r.goals_for) - SUM(r.goals_against) DESC, goals_for DESC
) r
CROSS JOIN (SELECT @rank := 0) v
ORDER BY position
Выход:
team points goals_for goals_against position
TEAM2 3 9 2 1
TEAM3 1 0 0 2
TEAM4 1 0 0 3
TEAM1 0 2 9 4
Демонстрация на dbfiddle
Этот запрос опирается на MySQL 8+, поскольку он использует CTE и функцию ROW_NUMBER()
(для окончательного ранжирования):
WITH teams AS (
SELECT team1 AS team FROM matches
UNION
SELECT team2 FROM matches
),
results AS (
SELECT t.team,
SUM(CASE WHEN m.team1 = t.team AND m.result_team_1 > m.result_team_2 THEN 3
WHEN m.team2 = t.team AND m.result_team_2 > m.result_team_1 THEN 3
WHEN (m.team1 = t.team OR m.team2 = t.team) AND m.result_team_1 = m.result_team_2 THEN 1
ELSE 0 END) AS points,
SUM(CASE WHEN m.team1 = t.team THEN m.result_team_1
ELSE m.result_team_2 END) AS goals_for,
SUM(CASE WHEN m.team1 = t.team THEN m.result_team_2
ELSE m.result_team_1 END) AS goals_against
FROM teams t
JOIN matches m ON m.team1 = t.team OR m.team2 = t.team
GROUP BY t.team)
SELECT t.team, r.points, r.goals_for, r.goals_against,
ROW_NUMBER() OVER(ORDER BY r.points DESC, r.goals_for - r.goals_against DESC, r.goals_for DESC) AS position
FROM teams t
JOIN results r ON r.team = t.team
ORDER BY position
Выход:
team points goals_for goals_against position
TEAM2 3 9 2 1
TEAM3 1 0 0 2
TEAM4 1 0 0 3
TEAM1 0 2 9 4
Демонстрация на dbfiddle