Последний логин, соединяющий две таблицы

У меня есть две таблицы:

members (
  userid int primary key
)

login_history (
  userid int,
  login datetime
)

Запись в таблицу login_history производится каждый раз, когда пользователь входит в систему.

Я пытаюсь написать запрос, чтобы найти время последнего входа в систему каждого пользователя. т.е. MAX(логин) или возвращает ноль, если у пользователя нет истории входа в систему. Какой SQL лучше всего подходит для этого? Спасибо


person Yada    schedule 06.01.2011    source источник


Ответы (2)


попробуй это

select nvl((max(login_history.login)),NULL), login_history.userid
from login_history, outer members
where login_history.userid = members.userid
group by login_history.userid
person CheeseConQueso    schedule 06.01.2011
comment
nvlCOALESCE, нет причин не использовать стандартную функцию. На самом деле, со вторым аргументом null, разве вы не можете просто полностью его опустить? - person derobert; 06.01.2011
comment
@derobert - я думал, что они оба стандартные? - person CheeseConQueso; 06.01.2011
comment
@CheeseConQueso: nvl — это расширение Oracle. См. также stackoverflow.com/questions/950084/ - person derobert; 06.01.2011
comment
@derobert - я думаю, что он пропустит их, и вам придется выполнить внешнее соединение в случае исключения nvl() или coalesce() - person CheeseConQueso; 06.01.2011
comment
@CheeseConQueso: На самом деле, я думаю, вам все равно нужно внешнее соединение, если вы хотите гарантировать получение строки для каждого member.userid. Так что это, вероятно, должно быть from members m left join login_history lh on (m.userid = lh.userid), а выбор должен быть m.userid. - person derobert; 06.01.2011
comment
@derobert - да, я думал о том же. кроме from login_history, outer members как единственное изменение - person CheeseConQueso; 06.01.2011
comment
@CheeseConQueso: я думаю, что синтаксис , outer members тоже может быть оракулизмом ... И вам определенно нужно изменить предложение select (потому что оно будет нулевым). Кроме того, я пропустил это, вам нужно изменить группу на m.userid тоже. - person derobert; 06.01.2011
comment
@derobert - это ораклизм ... ха-ха - оставьте ответ, проголосуйте за меня и прокляните меня! просто шучу, но я не собираюсь просто копировать ваши идеи в свои ответы, кроме outer, которые я все равно обдумывал самостоятельно. - person CheeseConQueso; 06.01.2011
comment
@CheeseConQueso: Нет, пожалуйста, обновите свой ответ. Если вам кажется неправильным получать признание за мои предложения, просто поставьте благодарность внизу. - person derobert; 06.01.2011
comment
Вам нужно нарисовать столбец идентификатора пользователя из таблицы members, а не из login_history, чтобы это работало. - person Larry Lustig; 06.01.2011
comment
@larry - да, это тоже говорил Дероберт - person CheeseConQueso; 06.01.2011
comment
Спасибо. Я уверен, что это работает. Я использую SQL Server. Не знаю, что делает функция NVL или что такое внешний. - person Yada; 07.01.2011

person    schedule
comment
@Yada, насколько я могу судить, пока это единственное, что будет работать. - person Larry Lustig; 06.01.2011
comment
Спасибо. Нужно сохранить этот фрагмент в банке памяти. - person Yada; 07.01.2011