Как использовать JOIN с условиями - PullRequest
1 голос
/ 15 мая 2019

В MySQL в командной строке я пытаюсь напечатать названия команд, которые забили более 3 голов в одной игре, будь то команда хозяев, команда гостей или оба.

У меня есть два отношения:

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

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

( home_team_id и away_team_id оба внешних ключа для Team.id )

Я начал с того, что пытался найти game_ids, в котором команда забила более 3 голов:

> 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 очков.Пожалуйста, помогите.

Ответы [ 3 ]

1 голос
/ 15 мая 2019

Получите все идентификаторы команд в одном столбце в подзапросе, используя UNION, а затем присоедините к нему команды.

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;
0 голосов
/ 15 мая 2019

Этот следующий запрос вернет Хозяева и Гости в отдельной строке, если оба забили более 3 голов в одном матче-

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
0 голосов
/ 15 мая 2019

В одном подходе используются коррелированные подзапросы:

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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...