mysql - 如何使用带条件的 JOIN

标签 mysql sql

在命令行的 MySQL 中,我试图打印在单场比赛中进球超过 3 个的球队的名称,无论是主队、客队还是两者。

我有两个关系:

Team
+---------+-----------+------+----+
| name    | shortName | abbr | id |
+---------+-----------+------+----+

Game
+---------+--------------+--------------+------------+------------+
| game_id | home_team_id | away_team_id | score_home | score_away |
+---------+--------------+--------------+------------+------------+

(home_team_idaway_team_id 都是 Team.id 的外键)

我首先尝试找到球队得分超过 3 个进球的 game_id:

> SELECT game_id, score_home, score_away 
FROM Game 
WHERE score_home > 3 OR score_away > 3;
+---------+------------+------------+
| game_id | score_home | score_away |
+---------+------------+------------+
|       7 |          6 |          2 |
|      35 |          3 |          4 |
|      70 |          4 |          1 |
|      71 |          2 |          5 |
|      84 |          5 |          1 |
|      88 |          6 |          2 |
|      97 |          1 |          5 |
|     103 |          6 |          1 |
+---------+------------+------------+

所以我很确定最多只有大约 8 支球队的进球数超过 3 个。然后我尝试了 INNER JOINS 但我不太确定这如何与两个不同的外键和条件一起工作,但这是我的尝试:

> SELECT Team.name as Team_Name, Game.game_id, Game.score_home, Game.score_away 
    -> FROM Team
    -> INNER JOIN Game ON Team.id=home_team_id OR Team.id=away_team_id
    -> WHERE score_home > 3 OR score_away > 3;
+-------------------+---------+------------+------------+
| Team_Name         | game_id | score_home | score_away |
+-------------------+---------+------------+------------+
| Arsenal           |      71 |          2 |          5 |
| Everton           |       7 |          6 |          2 |
| Manchester City   |      70 |          4 |          1 |
| Manchester City   |      84 |          5 |          1 |
| Manchester City   |     103 |          6 |          1 |
| Norwich City      |      88 |          6 |          2 |
| Tottenham Hotspur |      70 |          4 |          1 |
| Tottenham Hotspur |      97 |          1 |          5 |
| Newcastle United  |      88 |          6 |          2 |
| Newcastle United  |     103 |          6 |          1 |
| West Ham United   |      35 |          3 |          4 |
| Leicester City    |      71 |          2 |          5 |
| Sunderland        |       7 |          6 |          2 |
| Bournemouth       |      35 |          3 |          4 |
| Bournemouth       |      84 |          5 |          1 |
| Bournemouth       |      97 |          1 |          5 |
+-------------------+---------+------------+------------+

当我只想要得分高于 3 分的球队时,它会同时提供主队和客队名称。请帮忙。

最佳答案

使用 UNION 获取子查询中一列中的所有团队 ID,然后将团队加入其中。

SELECT t.name
       FROM (SELECT g.home_team_id team_id
                    FROM game g
                    WHERE score_home > 3
             UNION
             SELECT g.away_team_id team_id
                    FROM game g
                    WHERE score_away > 3) x
            INNER JOIN team t
                       ON t.id = x.team_id;

关于mysql - 如何使用带条件的 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56140107/

相关文章:

sql - 如何执行另一个数据库的存储过程?

sql - 复制的数据列未在Hive的目标表中分区

sql同名但值不同

c# - 如何将 byte[] 转换为 varchar?

mysql - 从 ON DUPLICATE KEY UPDATE 获取插入/更新行数

php - 当表中的tr为空时改变颜色

sql - sql server中不计算列值是否为0

java - spring boot如何在k8s中连接localhost mysql?

php - 停止从 CSV 插入第一行

sql - postgresql 中的数据透视表