Я хочу, чтобы последний ряд всех игроков за определенный месяц + год - PullRequest
3 голосов
/ 03 февраля 2012

Вот упрощенная версия моей таблицы sql за 2 месяца (СРОКИ ПО ДАТЕ):

player_id | дата | оценка
1 2011-05-25 1200
2 2011-05-25 3400
3 2011-05-26 3200
4 2011-05-26 4400
1 2011-05-28 1000
2 2011-05-28 2000
3 2011-05-29 3000
4 2011-05-29 4000

1 2011-06-24 1300
2 2011-06-24 2500
3 2011-06-24 5000
4 2011-06-24 3000

По сути, я хочу запрос, который показывает последний счет всех игроков за определенный месяц / конкретный год.

Пример:

Если я хочу получить итоговые результаты всех игроков за месяц 05, то есть результат будет:
1 2011-05-28 1000
2 2011-05-28 2000
3 2011-05-29 3000
4 2011-05-29 4000

Мой запрос sql:

  SELECT m1.* FROM table m1 
    LEFT JOIN table m2 ON (m1.player_id = m2.player_id AND m1.date < m2.date) 
    WHERE m2.date IS NULL 
    AND month(m1.date) = 05 
    AND year(m1.date) = 2011 
    ORDER BY score DESC); 

Похоже, это показывает не всех игроков, а только игроков, которые не играли в течение нескольких месяцев после 05. Где я могу добавить выбранную дату?

спасибо заранее!

** EDIT Ответ Джона Несториака ниже помог мне:)

Ответы [ 2 ]

2 голосов
/ 03 февраля 2012

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

С дополнительным ограничением он не хочет последнюю запись, но последнюю запись в данном месяце.

Как ни странно, вам нужно дважды задать это дополнительное ограничение, один раз в условии соединения и еще раз, чтобы отфильтровать результаты. Это должно сделать это для вас.

SELECT m1.* FROM table m1 
  LEFT JOIN table m2 ON 
    (m1.player_id = m2.player_id AND m1.date < m2.date 
     AND m2.date < '2011-06-01') 
  WHERE m2.date IS NULL AND month(m1.date) = 5 AND year(m1.date) = 2011
0 голосов
/ 03 февраля 2012

Предполагая, что комбинация (player_id, date) в Уникальном:

SELECT 
      t.*
FROM 
      TableX AS t
  JOIN
      ( SELECT 
              player_id
            , MAX(date) AS maxDate
        FROM
            TableX
        WHERE 
             date BETWEEN '2011-05-01'
                      AND LAST_DAY('2011-05-01')
        GROUP BY
              player_id
      ) AS tg
    ON  
      (tg.player_id, tg.maxDate) = (t.player_id, t.date)
ORDER BY 
      t.score DESC
...