【问题标题】:How to use JOIN with Conditions如何使用带条件的 JOIN
【发布时间】:2019-05-15 00:00:23
【问题描述】:

在命令行上的 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 分的球队时,它给了我主队和客队的名称。请帮忙。

【问题讨论】:

  • 您只需要球队名称(可能还有 ID),还是真的想列出球队得分超过 3 个进球的所有比赛?
  • 我只想要在一场比赛中进球数超过 3 的球队的球队名称,但我试图打印更多,以便仔细检查查询是否正确

标签: mysql sql


【解决方案1】:

使用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;

【讨论】:

    【解决方案2】:

    一种方法使用相关子查询:

    select t.name
    from team t
    where exists (select 1
                  from game g
                  where g.home_team_id = t.id and
                        g.score_home > 3
                 ) and
          exists (select 1
                  from game g
                  where g.away_team_id = t.id and
                        g.score_away > 3
                 ) ;
    

    此查询可以利用game(home_team_id, score_home)game(away_team_id, score_away) 上的索引。

    【讨论】:

      【解决方案3】:

      如果在单场比赛中都进了 3 个以上的球,则以下查询将在单独的行中返回 Home 和 Away-

      SELECT 
      T.Name as [Team_Name],
      A.Team_Type,
      A.Game_id,
      A.Score
      FROM
      (
          SELECT 'Home' AS [Team_Type],game_id AS Game_id,home_team_id as team_ID, score_home as Score WHERE score_home>3
          UNION ALL
          SELECT 'Away' AS [Team_Type], game_id AS Game_id,away_team_id as team_ID, score_away as Score WHERE score_away>3
      )A
      INNER JOIN Team T 
      ON T.id = A.team_ID
      ORDER BY A.Game_id
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-22
        • 2015-08-06
        • 2015-02-23
        • 2011-02-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多