Я пытаюсь получить 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
потому что в прошлом сезоне, который имеет 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
матч
|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
и datetime
больше, чем в предыдущих сезонах.
Я думаю, что 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;
Попробуй это:
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)
2017/2018
)?