Подзапрос не возвращает ожидаемый результат - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь получить season.id с максимальной датой для match. Запрос такой:

SELECT s.id AS season_id,
s.name AS season_name,
s.competition_id AS competition_id
FROM competition_seasons s
INNER JOIN competition_rounds r ON r.season_id = s.id
INNER JOIN `match` m ON m.round_id = r.id
WHERE s.competition_id = 89
AND m.datetime = (SELECT MAX(m.datetime) FROM `match` m WHERE m.round_id = r.id)
GROUP BY s.id

Как вы можете видеть, у меня есть таблица с именем competition_seasons, которая содержит все сезоны, доступные для соревнования, на этой таблице я получаю всю информацию о соревновании, в этом случае соревнование имеет идентификатор 89. Позже я получаю все rounds, доступные для сезона соревнований, за столом competition_rounds, match играется на round, поэтому я использую INNER JOIN на столе match, потому что мне нужно получите только rounds, которые имеют matches.

Соревнования 89 имеют разный сезон с разными турами, сезон, например:

  • 2017/2018
  • 2016/2017
  • 2015/2016

запрос должен вернуть 2017/2018, потому что в последнем сезоне, когда match с MAX(m.datetime) в этом поле указывают, когда идет матч, match, сыгранный в сезоне 2017/2018, означает, что дата, которая может начинаться с 2017 года и заканчиваться 2018 годом (т.е. в течение двух лет сезона).

Вместо этого результат запроса - 2011, что абсолютно бессмысленно.

Что я сделал не так в запросе?

competition_seasons

| id | name       | competition_id
 1     2017/2018       89
 2     2016/2017       89
 3     2015/2016       89

competition_rounds

| id | name        | season_id
 1     First           1
 2     Second          1
 3     First           2
 4     Second          2
 5     First           3

1046 * Матч *

|id | datetime           |  round_id
  1   2018-03-08 00:00:0    1
  2   2017-09-10 20:30:0    1
  3   2017-04-18 15:30:0    3
  4   2016-03-08 00:00:0    3
  5   2015-04-08 00:00:0    4
  6   2015-05-08 00:00:0    5

ожидаемый результат: season_id = 1, потому что match этого сезона имеет поле datetime больше, чем в предыдущих сезонах.

Ответы [ 2 ]

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

Я думаю ORDER BY и LIMIT будут работать:

SELECT s.id AS season_id, s.name AS season_name,
       s.competition_id AS competition_id
FROM competition_seasons s INNER JOIN
     competition_rounds r
     ON r.season_id = s.id INNER JOIN 
     `match` m
     ON m.round_id = r.id
WHERE s.competition_id = 89
ORDER BY m.datetime DESC
LIMIT 1;
0 голосов
/ 04 июля 2018

Попробуйте это:

SELECT s.id AS season_id,
s.name AS season_name,
s.competition_id AS competition_id
FROM competition_seasons s
INNER JOIN competition_rounds r ON r.season_id = s.id
INNER JOIN `match` m ON m.round_id = r.id
WHERE s.competition_id = 89
AND m.datetime = (SELECT MAX(m1.datetime) FROM `match` m1
                  INNER JOIN competition_rounds r1 
                  ON m1.round_id = r1.id
                  INNER JOIN competition_seasons s1
                  ON r1.season_id = s1.id
                  AND s1.competition_id = 89)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...