mysql - 将多个查询合并为一个查询时,如何将列求和

标签 mysql sql union-all

我正在尝试根据比赛表计算联赛排名。

+----------------------------------+
|              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                        |
+----------------------------------+

我可以使用此查询正确计算主场联赛积分榜:

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
ORDER BY POINTS DESC;

enter image description here

以及使用此查询的客场联赛积分榜:

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
ORDER BY points DESC;

enter image description here

但是使用 UNION ALL 组合这两个查询我没有得到正确的结果

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;

enter image description here

这应该是预期的结果:

enter image description here

知道我做错了什么吗?谢谢!

更新 1:

尝试 Dans 查询不起作用:

选择 team.name, HomePoints + AwayPoints 积分 来自团队加入( 选择 team.id, 总和(当 home.home_score > home.away_score 然后 3 的情况 当 home.home_score = home.away_score then 1 else 0 end) HomePoints, 总和(当 away.away_score > away.home_score 然后 3 else 0 结束时的情况)AwayPoints 来自团队 在 team.id = home.home_team_id 上加入主场比赛 在 team.id = away.away_team_id 上加入客场比赛 哪里 home.league_id = 94 AND home.season_id = 82 AND home.confirmed 不为空 按编号分组 ) team.id 上的临时工 = temp.id 按积分排序;

我得到这个结果:

enter image description here

最佳答案

您可能想要使用 JOIN 而不是 UNION。 在对具有 team_id 的子查询使用 UNION 之后,您在 team_id 上使用 GROUP BY。 那是行不通的...如果您只使用联接,您甚至可以忽略分组依据。

关于mysql - 将多个查询合并为一个查询时,如何将列求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23452131/

相关文章:

sql查询 friend 的 friend

php - MYSQL:SQL查询获取自增字段的值

sql - 与联合所有SQL查询获取错误 'Column specified multiple times'

MySQL 以句子结尾 SUBSTRING

mysql - 对 Mysql 中不同条件的行求和

mysql - flutter 连接到服务器中的数据库

php - mysql插入查询变量问题

java - 从 mysql 数据库中选择一个带撇号的列名

sql - 字符串作为 PostgreSQL 列中的所有记录

MySQL UNION 似乎无法正常工作