Запрос самой новой записи в таблице, сохранение запроса в виде представления - PullRequest
1 голос
/ 17 сентября 2010

Я пытаюсь превратить этот запрос в представление:

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

Но представления не принимают подзапросы.

То, что это делает, ищет последнюю, новейшую запись пользователя. Я получил идею от этого другого вопроса stackoverflow

Есть ли способ превратить это в запрос с объединениями, возможно?

Ответы [ 2 ]

2 голосов
/ 17 сентября 2010

Создайте два представления

 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, и вы включили where t.CreationDate = MaxDate в годorig sql, мне интересно, хотите ли вы видеть все строки для каждого отдельного пользователя с максимальной датой создания для этого пользователя в каждой строке, или вам нужна только одна строка на пользователя, одна строка, которая была создана совсем недавно?

Если последний случай, как @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 голос
/ 17 сентября 2010
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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...