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

时间:2012-11-28 11:58:24

标签: mysql join view aggregate-functions

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

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

会员拥有'login_activities'

    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不允许在创建视图中使用子查询

3 个答案:

答案 0 :(得分:2)

你几乎就在那里。你有登录时间,但我会接受它并获取最后一个登录ID以简化重新加入登录活动表与尝试在用户和日期/时间字段上进行连接,因为我希望有一个关键字ID的主键,而不一定是(member,login_time) - 但是,对于使用按成员分组的最小/最大日期的查询,我将DEFINITELY在(member,login_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如何实现视图而失败,您可能需要使用TWO视图,例如

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

答案 1 :(得分:0)

试试这个:

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

答案 2 :(得分:0)

你需要再次加入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