我有一张名为“会员”的桌子

    id     name
 ===================
    a      John
    b      Frank

成员具有“登录活动”
    id     login_time     gol     member
==========================================
    1      2012-10-01      99      a
    2      2012-10-01     125      b
    3      2012-11-01     255      a
    4      2012-11-02     111      b
    5      2012-11-07     101      a

我想创建一个视图,其中包含有关成员首次登录和上次登录时间的信息,以及仅上次登录时的“gol”值。
有可能吗?
我试过很多方法。我的一个尝试:
CREATE VIEW   view_firstlast
     AS
          SELECT
               MIN(a.login_time) as first_login,
               MAX(a.login_time) as last_login,
               a.gol,
               b.name
          FROM
               login_activities a
                   JOIN member b ON a.member = b.id
          GROUP BY
               a.member

结果不对。“gol”值来自第一次登录。
怎么做?
这里有一点很重要:MySQL不允许在create视图中使用子查询

最佳答案

你就快到了。您有登录时间,但我会接受它并获取最后一个登录ID,以简化对login activities表的重新连接,而不是尝试在user和date/time字段上进行连接,因为我希望ID的主键上有一个键,而不一定在(member,login_time)--但是,对于使用按member分组的min/max on date的查询,我一定会有一个索引(成员,登录时间)进行优化。

SELECT
      m.Name,
      PreQuery.First_Login,
      PreQuery.Last_Login,
      LA2.GOL
   from
      ( select
              LA.member,
              MIN(LA.login_time) as first_login,
              MAX(LA.login_time) as last_login,
              MAX(LA.ID) as LastLoginID
          FROM
              login_activities LA
          group by
              LA.member ) PreQuery
        JOIN member M
           ON PreQuery.member = M.id
        JOIN login_activities LA2
           ON PreQuery.LastLoginID = LA2.id

然后,由于上面的方法可以工作,但是由于MySQL实现视图的方式而失败,您可能需要使用两个视图来完成,这样
create view MemberFirstLastOnly
as
select
      LA.member,
      MIN(LA.login_time) as first_login,
      MAX(LA.login_time) as last_login,
      MAX(LA.ID) as LastLoginID
   FROM
      login_activities LA
   group by
      LA.member

然后是另一个
create view MemberLastFirstFinal
as
    SELECT
          m.Name,
          MFLO.First_Login,
          MFLO.Last_Login,
          LA2.GOL
       from
          MemberFirstLastOnly MFLO
            JOIN member M
               ON PreQuery.member = M.id
            JOIN login_activities LA2
               ON PreQuery.LastLoginID = LA2.id

10-05 19:41