MySql:创建视图连接从子表获取最大值和最小值

MySql:创建视图连接从子表获取最大值和最小值,mysql,join,view,aggregate-functions,Mysql,Join,View,Aggregate Functions,喂,我有一个名为'member'的表 id name =================== a John b Frank 成员具有“登录\u活动” id login_time gol member ========================================== 1 2012-10-01 99 a 2 2012-10-01

喂,我有一个名为'member'的表

    id     name
 ===================
    a      John
    b      Frank
成员具有“登录\u活动”

    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 VIEW   view_firstlast
     AS
          SELECT
               MIN(a.login_time) AS first_login,
               MAX(a.login_time) AS last_login,
               a.gol,
               b.name
          FROM member b 
               LEFT JOIN login_activities a
                   a.member = b.id
          GROUP BY
               b.member

你就快到了。您有登录时间,但我也会获取最后一个登录ID,以简化对登录活动表的重新连接,而不是尝试在用户和日期/时间字段上进行连接,因为我希望ID主键上有一个键,而不一定在成员上有一个键,login\u time-但是,对于使用按成员分组的最小/最大日期的查询,我肯定会有一个成员索引,登录时间优化

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

您需要再次加入login_activities表,但是使用mysql的一个特殊功能,它允许您获得另一列的最大/最小值的整行:

CREATE VIEW view_firstlast AS
SELECT
    MIN(a.login_time) as first_login,
    MAX(a.login_time) as last_login,
    c.gol,
    b.name
FROM login_activities a
JOIN member b ON a.member = b.id
JOIN (
    SELECT * FROM (
        SELECT gol, member
        FROM login_activities
        ORDER BY login_time desc) x
    GROUP BY member) c ON c.member = b.member
GROUP BY a.member

谢谢但它不起作用。“gol”值在第一次登录时仍然给出。要查找的gol值是最新登录的gol值,然后必须创建2个视图。我得到了这个错误:1349-视图的SELECT在FROM中包含一个子查询clause@TikasMamed,当然它需要一个子查询。。。我不知道有什么办法可以不做。如果您自己运行查询,它会得到您想要的吗?因为我通常不处理视图,所以我从未见过您指出的错误。您可以将其更改为存储过程而不是视图,但这会限制您在其他地方将其用作可查询表。是的。。你说得对。这是给正确的结果。所以,不可能像我想的那样创建视图,因为在创建视图时,似乎不允许子查询视图,这是个好主意。尽管Saharsh Shah告诉我创建2个视图,但我从未想过会是这样。非常感谢,德拉普。它解决了我的问题。