November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags
Wednesday, September 15th, 2010 06:20 pm

Для DBA её тоже можно применять. На самом начальном этапе, потому что если кандидат не смог навскидку ответить, то он никакой не DBA, а чмо какое-то. А вот программист такого может сразу не знать, но придумать должен, если умный.

Итак. Есть табличка foo, в которой содержатся данные об игроках по дням в следующем виде: date, user_id, nickname и кучка других данных за указанный день, которые нас не интересуют. Игрок идентифицируется по user_id и участвует в игре под псевдонимом nickname. В теории nickname у игрока меняться не должен, а на практике может, поэтому в разные дни у одного user_id может быть разный nickname. Для каждого user_id за каждую дату может быть не более одной записи, потому что nickname в течение дня меняться не может, к счастью.

Задача: выбрать одним запросом (можно с подзапросами) полный список всех user_id и для каждого из них один-единственный nickname – тот, под которым игрок играл последний раз.

Классический ответ под катом, но если кто знает другие варианты – welcome.

SELECT a.userid, a.nickname
FROM foo a
WHERE a.date = (SELECT MAX(b.date) FROM foo b WHERE b.user_id = a.user_id)

Оригинал этой записи. Комментировать можно тут или там.

Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме

Wednesday, September 15th, 2010 08:05 pm (UTC)
SELECT a.userid, b.nickname
FROM
(
SELECT userid, MAX(date)
FROM foo
GROUP BY userid
) a
INNER JOIN foo b
ON a.userid = b.userid AND a.date = b.date
Wednesday, September 15th, 2010 08:29 pm (UTC)
и тем не менее, он тут есть :)
В целом работает, только к MAX(date) надо подписать AS date, иначе ругается на отсутсвие a.date
Wednesday, September 15th, 2010 09:46 pm (UTC)
Я имел в виду коррелирующие подзапросы, конечно. Предполагаю, что при тупом оптимизаторе, этот запрос будет гораздо быстрее выполнятся, чем классический вариант.