我有一张名为“会员”的桌子
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