首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建一个返回具有最新日期的非重复id的视图

创建一个返回具有最新日期的非重复id的视图
EN

Stack Overflow用户
提问于 2011-03-16 11:29:28
回答 2查看 483关注 0票数 0

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

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

代码语言:javascript
运行
复制
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

我的观点应该是:

代码语言:javascript
运行
复制
ID  Stat  Date        
-------------------- 
02  BBB   02/02/2010 
03  DDD   06/01/2010
01  EEE   07/01/2010

我看了看周围,我发现这个查询可以工作:

代码语言:javascript
运行
复制
  SELECT * 
    FROM (SELECT * 
            FROM TABLE 
        ORDER BY DATE DESC) tmp 
GROUP BY ID

现在的问题是,我似乎不能在MYSQL的视图中执行子查询。

我试着把它分成两个视图,第一个是这样的:

代码语言:javascript
运行
复制
CREATE OR REPLACE VIEW VIEW_TEMP AS
  SELECT * 
    FROM TABLE 
ORDER BY DATE DESC

第二个是:

代码语言:javascript
运行
复制
CREATE OR REPLACE VIEW NEW_VIEW AS
  SELECT * 
    FROM VIEW_TEMP 
GROUP BY ID

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

EN

回答 2

Stack Overflow用户

发布于 2011-03-16 11:38:45

使用:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
  SELECT a.id, 
         a.stat,
         MAX(a.date) AS date
    FROM YOUR_TABLE a
GROUP BY a.id
票数 0
EN

Stack Overflow用户

发布于 2011-03-16 13:20:42

代码语言:javascript
运行
复制
SELECT *
FROM table
GROUP BY id, date
HAVING MAX(date)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5320741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档