Obecnie osiągam wynik poniżej, używając tabeli o nazwie league_standing
i aktualizując ją po każdym meczu. Chciałbym móc wykonać jedno zapytanie względem tabeli matches
.Jak podsumować kolumny za pomocą klucza obcego, który znajduje się w dwóch kolumnach?
Teams
grać ze sobą dwa razy, zarówno w kraju jak i na wyjeździe. Zauważ, jak team_id
jest w dwóch kolumnach home_team_id
i away_team_id
+----------------------------------+
| Matches |
+----------------------------------+
| id |
| league_id (FK League) |
| season_id (FK Season) |
| home_team_id (FK Team) |
| away_team_id (FK Team) |
| home_score |
| away_score |
| confirmed |
+----------------------------------+
Oto co próbowałem, ale nie powiodło się:
select team.name, HomePoints + AwayPoints points
from team join (
select team.id,
sum(case when home.home_score > home.away_score then 3
when home.home_score = home.away_score then 1 else 0 end) HomePoints,
sum(case when away.away_score > away.home_score then 3 else 0 end) AwayPoints
from team
join matches home on team.id = home.home_team_id
join matches away on team.id = away.away_team_id
WHERE home.league_id = 94
AND home.season_id = 82
AND home.confirmed IS NOT NULL
group by id
) temp on team.id = temp.id
order by points desc;
To daje mi źle punkty:
i ten daje mi poprawny wynik ligowych pozycji gospodarzy tylko
SELECT * FROM
(
SELECT team.name, home_team_id AS team_id,
COUNT(*) AS played,
SUM((CASE WHEN home_score > away_score THEN 1 ELSE 0 END)) AS won,
SUM((CASE WHEN away_score > home_score THEN 1 ELSE 0 END)) AS lost,
SUM((CASE WHEN home_score = away_score THEN 1 ELSE 0 END)) AS drawn,
SUM(home_score) AS goalsFor,
SUM(away_score) AS goalsAgainst,
SUM(home_score - away_score) AS goalDifference,
SUM((CASE WHEN home_score > away_score THEN 3 WHEN home_score = away_score THEN 1 ELSE 0 END)) AS points
FROM matches
INNER JOIN team ON matches.home_team_id = team.id
WHERE league_id = 94
AND season_id = 82
AND confirmed IS NOT NULL
GROUP BY home_team_id
UNION
SELECT team.name, away_team_id AS team_id,
COUNT(*) AS played,
SUM((CASE WHEN away_score > home_score THEN 1 ELSE 0 END)) AS won,
SUM((CASE WHEN home_score > away_score THEN 1 ELSE 0 END)) AS lost,
SUM((CASE WHEN home_score = away_score THEN 1 ELSE 0 END)) as drawn,
SUM(away_score) AS goalsFor,
SUM(home_score) AS goalsAgainst,
SUM(away_score - home_score) AS goalDifference,
SUM((CASE WHEN away_score > home_score THEN 3 WHEN away_score = home_score THEN 1 ELSE 0 END)) AS points
FROM matches
INNER JOIN team ON matches.away_team_id = team.id
WHERE league_id = 94
AND season_id = 82
AND confirmed IS NOT NULL
GROUP BY away_team_id
) x
GROUP BY team_id
ORDER BY points DESC;
Jeśli to pomoże, moje schematu bazy danych:
Utknąłem! Mam nadzieję, że możesz pomóc.
Nie rób tego. Jedną z zasad normalizacji baz danych jest nie zapisywanie wartości obliczonych. Zawsze możesz zaprezentować wyniki, uruchamiając zapytanie na innych stołach. –
@DanBracuk Więc lepiej byłoby uruchomić kwerendę wybierającą w dopasowaniach, a następnie użyć PHP do obliczenia klasyfikacji? – Jonathan