MySql:创建视图连接从子表获取最大值和最小值
喂,我有一个名为'member'的表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
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个视图,但我从未想过会是这样。非常感谢,德拉普。它解决了我的问题。