查询表中的最新记录,将查询存储为视图

时间:2010-09-16 21:02:44

标签: sql mysql many-to-many

我正在尝试将此查询转换为视图:

SELECT t.*
 FROM user t
 JOIN (SELECT t.UserId, 
              MAX( t.creationDate ) 'max_date'
         FROM user t
     GROUP BY t.UserId) x ON x.UserId = t.UserId
                         AND x.max_date = t.creationDate

但是视图不接受子查询。

这样做是为了寻找用户的最新,最新记录。 我从this other stackoverflow question

得到了这个想法

有没有办法将此转换为带有连接的查询,也许?

2 个答案:

答案 0 :(得分:2)

创建两个视图

 Create View MaxCreationDate
 As
      SELECT t.userId, Max(t2.CreationDate) MaxCreated
      FROM user t 
      Group By t.UserId

Create View UserWithMaxDate
As
      Select t.*, m.MaxCreated From user t
         Join MaxCreationDate m
             On m.UserId= t.UserId

然后再拨打第二个......

编辑:嘿,基于Quassnoi的评论,以及你的收录  在原始SQL中where t.CreationDate = MaxDate,我想知道您是否希望查看每个不同用户的所有行,每个行中该用户的最大创建日期,或者,您是否希望每个用户只有一行,一行这是最近创建的?

如果是后者,如@Quassnoi在评论中建议的那样,请更改第二个视图查询,如下所示

Create View UserWithMaxDate
As
      Select t.*, m.MaxCreated From user t
         Join MaxCreationDate m
             On m.UserId= t.UserId
                 And m.MaxCreated = t.Creationdate

答案 1 :(得分:1)

CREATE INDEX ix_user_userid_creationdate_id ON user (userid, creationdate, id);

CREATE VIEW v_duser AS
SELECT  DISTINCT userId
FROM    user;

CREATE VIEW v_lastuser AS
SELECT  u.*
FROM    v_duser ud
JOIN    user u
ON      u.id =
        (
        SELECT  ui.id
        FROM    user ui
        WHERE   ui.userid = ud.userid
        ORDER BY
                ui.userid DESC, ui.creationdate DESC, ui.id DESC
        LIMIT 1
        );

这很快,可以处理(userid, creationdate)上的重复项。