2017-02-16 1 views
0

이것은 내 인터뷰에서 질문입니다.인터뷰 Q : 테이블 login_log를 last_login으로 변환하십시오.

우리 시스템에서는 모든 로그인 이벤트가 login_log 테이블에 기록됩니다. 그것은 주로 3 열이 포함

  • USER_ID
  • login_time
  • login_ip

우리는 지금 36,000 명의 사용자가 및이에 3,600,000 행이 때문에 각 사용자는 평균 약 100 배에 로그인 한 표.

그러면이 테이블을 last_login이라는 다른 테이블로 변환하고 각 사용자의 최신 로그인 이벤트 만 기록하려고합니다. 그래서이 새로운 테이블에 36,000 개 이상의 행이 없을 것

  • USER_ID
  • last_login_time
  • last_login_ip

: 그것은 또한 3 열이 포함되어 있습니다.

후보자는 SQL 또는 프로그래밍을 통해이 문제를 해결할 수 있습니다. 일부 후보자는 단 하나의 SQL로 그것을 해결했습니다.

즐기세요!

UPDATE

힌트 : login_log는 기본 키와 같은 AUTO_INCREMENT id을 가질 수있다. 최신 로그인 한 이벤트의 최대 값은 id입니다. 내 이전 대답을 찾은 후

답변

1

편집 업데이트 대답은 당신이 link

테스트 프로그램을 통해 sqlFiddle.com에 결과를 찾을 수

select 
    user_id 
    , max(login_time) last_login_time 
    , max(login_ip) last_login_ip 
from 
    (
     select 
      user_id 
      , login_time 
      , max(login_ip) login_ip 
     from 
      login_log 
     group by user_id, login_time 
    ) t -- this sub-query makes sure we have only one row for each user_id+login_time 
group by user_id; 

이 정확하지 않았다 - 테이블을 빌드 :

create table login_log (
    user_id int not null 
    , login_time datetime not null 
    , login_ip int not null 
    , index(user_id) 
    , index(login_time) 
); 

insert into login_log 
values 
(1, '2017-02-17', 100) 
, (1, '2017-02-15', 200) 
, (2, '2017-02-17', 300) 
, (2, '2017-02-14', 400) 
, (2, '2017-02-17', 500); 

01의 경우 연결을 끊으려면 여기에 하위 쿼리 (t)가 필요합니다.주어진 행에 두 개 이상의 행이 있습니다. user_id PLUS login_time 조합입니다. 하위 쿼리는 확실히는 하나의 행 내 이전 대답은 코너 케이스를 잊어 따라서 가 정확하지

그것 (max(login_ip)와 하나)에서 나온다 있습니다.

+0

다른 login_log 행 (2, '2017-02-17', 500)을 추가하고 다시 시도하십시오 :-) – auntyellow

+0

@auntyellow - 좋은 지적입니다. 위의 내 대답을 업데이트했습니다. 감사! – leeyuiwah