Для 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)
Оригинал этой записи. Комментировать можно тут или там.
не люблю подзапросы...
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
Re: не люблю подзапросы...
В целом работает, только к MAX(date) надо подписать AS date, иначе ругается на отсутсвие a.date
Re: не люблю подзапросы...