2017-02-16 3 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またはプログラミングによってこの問題を解決できます。候補者の中には、1つのSQLだけで解決するものがあります。

お楽しみください!

UPDATE

ヒント:login_logが主キーとしてAUTO_INCREMENT idを有することができます。最新のログインしたイベントの最大値はidです。

答えて

1

EDIT私の以前の答えを見つけた後更新答えは

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; 

正しくありませんでしたあなたはこのlink

テストプログラムを経てsqlFiddle.comで結果を見つけることができます - テーブルを構築します。

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); 

ここでは、サブクエリ(t)が必要な場合は、ケース 与えられた行に複数の行があります。user_id PLUS login_time の組み合わせです。サブクエリは確かのみ単一行 は(max(login_ip)と1)、そこから出てくる可能

私の以前の答えは、このようなコーナーケースを忘れてしまったので、 が間違っていました。

+0

別のlogin_log行(2、 '2017-02-17'、500)を追加してもう一度お試しください:-) – auntyellow

+0

@auntyellow - それは良い点です。私は上記の私の答えを更新しました。ありがとう! – leeyuiwah

関連する問題