面试题:如何把login_log表转换成last_login表?

这是我经常问的一道题。

在我们系统中,每次用户登录事件都会记录到login_log表,主要有三列:

  • user_id

  • login_time

  • login_ip

我们系统目前有36,000个用户,平均每个用户登录了100次左右,因此该表有3,600,000行左右的数据了。

现在我们需要把这张表转换成一张名为last_login的表,它只记录每个用户最近一次登录事件,同样有三列:

  • user_id

  • last_login_time

  • last_login_ip

因此这个表不会超过36,000行。

可以用SQL实现,也可以用程序实现。

试试看吧 :-)

UPDATE

提示:按照数据库设计的一般原则,login_log表应该会有个自增主键id,最后一次登录事件的id最大。

阅读 2.9k
1 个回答

如果只是导数据,用下面的SQL就搞定了:

INSERT 
INTO 
    last_login(user_id,last_login_time,last_login_ip)
SELECT
    log.user_id,
    log.login_time ,
    log.login_ip
FROM
    login_log log,
    (
        SELECT
            user_id,
            MAX(login_time) last_login_time
        FROM
            login_log
        GROUP BY
            user_id
    ) last_log
WHERE
    log.user_id= last_log.user_id
AND log.login_time= last_log.last_login_time;
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题