说,我有一个名为'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不允许在创建视图中使用子查询
答案 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