2015-07-17 2 views
0

У меня есть таблица, которая является футбольным расписанием, и каждая игра имеет идентификатор игры и номер недели (weekNum). Мне нужно получить максимальный игровой идентификатор каждую неделю (по сути, получать последнюю игру за каждую неделю).Выберите MAX с каждой недели номер

Сейчас я использую это:

SELECT * FROM nflp_schedule WHERE gameID = (SELECT MAX(gameID) from nflp_schedule) 

Он тянет самую последнюю игру ... но я понятия не имею, как вытащить последнюю игру за каждую неделю. Есть идеи?

ответ

0

Это даст вам все недель с максимальной gameID для каждого. Возвращенные строки будут упорядочены по weekNum по возрастанию.

SELECT weekNum, MAX(gameID) AS lastGameOfWeek 
FROM nflp_schedule 
GROUP BY weekNum 
ORDER BY weekNum ASC 

Чтобы получить другие значения основаны на возвращаемый GameID является производным выше, вам нужно будет либо сделать подвыбор как условие фильтрации или объединения.

Это может выглядеть следующим образом (используя подзапрос):

SELECT gameID, weekNum, homeScore, visitorScore 
FROM nflp_schedule 
WHERE gameID IN (
    SELECT MAX(gameID) 
    FROM nflp_schedule 
    GROUP BY weekNum 
) 
ORDER BY weekNum ASC 

Или как это (используя соединение):

SELECT 
    n.gameID AS gameID, 
    n.weekNum AS weekNum, 
    n.homeScore AS homeScore, 
    n.visitorScore AS visitorScore 
FROM nflp_schedule AS n 
INNER JOIN (
    SELECT MAX(gameID) AS maxGameID 
    FROM nflp_schedule 
    GROUP BY weekNum 
) AS max 
    ON n.gameID = max.maxGameID 
ORDER BY n.weekNum ASC 

Вы заметите, что подзапрос используется в запросе с соединением выше выглядит очень аналогично подзапрос, который используется непосредственно в предложении WHERE в примере до этого. Это действительно просто способ применения «таблицы», созданной подзапросом, в качестве фильтра в основной таблице. Возможно, вам захочется проверить оба подхода, чтобы увидеть, что выполняется быстрее, учитывая ваши данные.

+0

Это работает чудесно. Огромное спасибо. – enjoimark

+0

Любой способ добавить другие значения в таблицу? Я хочу, чтобы он вытащил visitorScore и homeScore для этих соответствующих игровых идентификаторов ... Я добавил их, но, похоже, просто вытаскивает случайные значения. – enjoimark

+0

@enjoimark Не использовать функции aggregate (i.e 'MAX()'). Если вы просто добавите другие столбцы без указания агрегации, вы получите непредсказуемые значения из любой из записей в этой группе. Я буду обновлять свой ответ с помощью другого подхода, который вам нужно предпринять, чтобы получать значения из конкретных записей, возвращаемых из этого запроса. –

0

Попробуйте это .. я не на MySQL так не могу проверить, но это должно сделать это ..

select * 
    from nflp_schedule a, 
     (SELECT weekNum, Max(gameID) 
      FROM nflp_schedule 
      ) b 
    where a.gameID = b.gameID 
Смежные вопросы