Как решить эту проблему с агрегатами и UNION в MySQL? - PullRequest
0 голосов
/ 19 сентября 2011

Если мои данные это

match homeTeam  awayTeam  homeTeamID  awayTeamID  homePoints awayPoints
  1    Alpha      Beta        1           2           4          2
  2    Gamma      Delta       3           4           6          0
  3    Alpha      Gamma       1           3           2          4
  4    Delta      Beta        4           2           3          3

Мне нужно сделать для них лестницу, но я не могу понять, что правильно

Результаты должны выглядеть следующим образом

Name  played  Points
Gamma    2      10
Alpha    2       6
Beta     2       5
Delta    2       3

Пока мой код выглядит так

$query = "SELECT *
    FROM (
        SELECT homeTeam AS teamName,
            COUNT(homeTeamID) AS matches_played,
            SUM(if(homeTeamID, homePoints, 0)) AS total_points
            FROM matches
        UNION ALL SELECT awayTeam AS teamName,
            COUNT(awayTeamID) AS matches_played,
            SUM(if(awayTeamID, awayPoints, 0)) AS total_points
            FROM matches
        ) all_points
    GROUP BY teamName
    ORDER BY total_points DESC  ";

но все, что он сделал, это показал, что АЛЬФА сыграла 4 игры за 15 очков, а БЕТА сыграла 4 игры за 9 очков - Гамма и Дельта исчезли: (

1 Ответ

4 голосов
/ 19 сентября 2011

У вас нет предложения GROUP BY во внутреннем запросе.Но это все еще неправильно.попробуй:

SELECT teamName, COUNT(*) AS played, SUM(points) as points
    FROM (
        SELECT homeTeam AS teamName,
            homePoints AS points
            FROM matches
        UNION ALL SELECT awayTeam AS teamName,
            awayPoints AS points
            FROM matches
        ) all_points
    GROUP BY teamName
    ORDER BY total_points DESC
...