Оператор IN не возвращает всю запись в диапазоне - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь вернуть все matches, доступные в диапазоне round, каждый раунд может иметь различное совпадение. Поэтому я написал этот запрос:

SELECT m.id, m.round_id, m.gameweek
 FROM `match` m
 LEFT JOIN competition_rounds r ON m.round_id = r.id
 LEFT JOIN competition_seasons s ON r.season_id = s.id
 LEFT JOIN competition c ON c.id = s.competition_id
 WHERE 1 AND
 m.status = 5 AND
 m.round_id IN (488, 489, 490, 491) AND
 m.gameweek = (SELECT MAX(m2.gameweek)
                FROM `match` m2
                WHERE m2.round_id IN (488, 489, 490, 491))

Теперь проблема в том, что результат возвращает только matches раунда с идентификатором 488, почему остальные раунды игнорируются? Спасибо.

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Вам нужен коррелированный подзапрос:

SELECT m.id, m.round_id, m.gameweek
 FROM `match` m
 LEFT JOIN competition_rounds r ON m.round_id = r.id
 LEFT JOIN competition_seasons s ON r.season_id = s.id
 LEFT JOIN competition c ON c.id = s.competition_id
 WHERE 1 AND
 m.status = 5 AND
 m.round_id IN (488, 489, 490, 491) AND
 m.gameweek = (SELECT MAX(m2.gameweek)
                FROM `match` m2
                WHERE m2.round_id = m.round_id)
0 голосов
/ 04 июля 2018

Я предполагаю, что этого запроса достаточно:

SELECT m.id, m.round_id, m.gameweek
FROM `match` m
WHERE 1 AND
      m.status = 5 AND
      m.round_id IN (488, 489, 490, 491) AND
      m.gameweek = (SELECT MAX(m2.gameweek)
                    FROM `match` m2
                    WHERE m2.round_id = m.round_id AND
                          m2.status = m.status
                   );

То есть, вы, вероятно, хотите принять во внимание и статус. И вам не нужны JOIN s, если вы действительно не хотите дубликатов в результате.

0 голосов
/ 04 июля 2018

Думаю, вы захотите:

SELECT m.id, m.round_id, m.gameweek
 FROM `match` m
 LEFT JOIN competition_rounds r ON m.round_id = r.id
 LEFT JOIN competition_seasons s ON r.season_id = s.id
 LEFT JOIN competition c ON c.id = s.competition_id
 WHERE 1 AND
 m.status = 5 AND
 m.round_id IN (488, 489, 490, 491) AND
 m.gameweek = (SELECT MAX(m2.gameweek)
                FROM `match` m2
                WHERE m2.round_id = m.round_id))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...