创建一个返回具有最新日期的不同ID的视图

时间:2011-03-16 03:29:28

标签: mysql sql view

我正在尝试构建一个包含user_id,date和统计值的视图,但我遇到了一个问题。

基本上,如果我有一个包含以下内容的表:

ID  Stat  Date        
--------------------
01  AAA   01/01/2010
02  BBB   02/02/2010  
03  CCC   05/01/2010
03  DDD   06/01/2010
01  EEE   07/01/2010

我的观点应该是:

ID  Stat  Date        
-------------------- 
02  BBB   02/02/2010 
03  DDD   06/01/2010
01  EEE   07/01/2010

我环顾四周,发现这个查询有效:

  SELECT * 
    FROM (SELECT * 
            FROM TABLE 
        ORDER BY DATE DESC) tmp 
GROUP BY ID

现在的问题是,我似乎无法在MYSQL中的视图中进行子查询。

我尝试将它分成两个视图,第一个像这样:

CREATE OR REPLACE VIEW VIEW_TEMP AS
  SELECT * 
    FROM TABLE 
ORDER BY DATE DESC

和第二个:

CREATE OR REPLACE VIEW NEW_VIEW AS
  SELECT * 
    FROM VIEW_TEMP 
GROUP BY ID

问题是,当第一个视图返回与子查询相同的结果时,第二个视图会给出错误的日期值。

2 个答案:

答案 0 :(得分:0)

使用:

SELECT a.id, 
       a.stat,
       a.date
  FROM YOUR_TABLE a
  JOIN (SELECT t.id,
               MAX(t.date) AS max_date
          FROM YOUR_TABLE t
      GROUP BY t.id) b ON b.id = a.id
                      AND b.max_date = a.date

我没有对此进行测试以创建视图,但我记得MySQL不允许视图中的子查询。 According to the documentation, about view restrictions

  

SELECT语句不能在FROM子句中包含子查询。

此外,如果有2个以上的id值具有相同的最大日期值,则可能会出现重复项 - 如有必要,请在查询中添加DISTINCT

自联接保证为stat列返回的值 - that can't be said if relying on MySQL's hidden column in the GROUP BY functionality

  SELECT a.id, 
         a.stat,
         MAX(a.date) AS date
    FROM YOUR_TABLE a
GROUP BY a.id

答案 1 :(得分:0)

SELECT *
FROM table
GROUP BY id, date
HAVING MAX(date)