使用HAVING子句查找记录

4

我希望能够检索到最近修改时间的所有记录。 例如,以这个表格为例:

|page_url|last_modified|
---------
|abc.com |2010-10-01 10:00:00|
|xyz.com |2010-10-04 12:10:00|
|xyz.com |2010-10-04 12:00:00|
|xyz.com |2010-10-04 10:00:00|
|abc.com |2010-10-01 08:00:00|

输出应包含以下数据:
|page_url|last_modified|
---------
|abc.com |2010-10-01 10:00:00|
|xyz.com |2010-10-04 12:10:00|

我尝试使用以下having子句,但对我不起作用 :(
SELECT page_url, last_modified 
FROM
my_table
HAVING MAX(last_modified);

编辑1:我的表中有25个字段要使用。但是,我想我不能对所有字段应用group by。现在该怎么办?
5个回答

4

不需要使用HAVING,只需使用GROUP BY子句。

SELECT page_url, MAX(last_modified) 
FROM my_table
GROUP BY page_url

更新 1

SELECT  a.*
FROM    my_table a
        INNER JOIN
        (
            SELECT page_url, MAX(last_modified) recentDate
            FROM my_table
            GROUP BY page_url
        ) b ON a.page_url = b.page_url AND
                a.last_modified = b.recentDate

我有25个字段可以使用。但是,我猜不能对所有字段应用group by。现在该怎么办? - Saurabh Saxena
1
@SaurabhSaxena 好的,我明白了,试试我的更新答案。你需要在子查询中先获取最新日期,然后将其与原始表格自身连接。 - John Woo

2
尝试在select语句中使用group bymax()
SELECT page_url, max(last_modified) 
FROM  my_table
group by page_url

更多信息:


2
如果您正在使用具有元组功能的RDBMS,例如Postgresql、MySql和Oracle。您可以使用以下方法。
假设您已经拥有了像这样的现有视图:
create view page_latest as

SELECT page_url, MAX(last_modified) recentDate
FROM tbl
GROUP BY page_url;


select * from page_latest;

输出...

| PAGE_URL |                     RECENTDATE |
---------------------------------------------
|  abc.com | October, 01 2010 10:00:00+0000 |
|  xyz.com | October, 04 2010 12:10:00+0000 |

...基于这些数据:

| PAGE_URL |                  LAST_MODIFIED |            MESSAGE |
------------------------------------------------------------------
|  abc.com | October, 01 2010 10:00:00+0000 |           no alarm |
|  xyz.com | October, 04 2010 12:10:00+0000 |       no surprises |
|  xyz.com | October, 04 2010 12:00:00+0000 | fake plastic trees |
|  xyz.com | October, 04 2010 10:00:00+0000 |              creep |
|  abc.com | October, 01 2010 08:00:00+0000 |         thom yorke |

您可以通过使用上述关系型数据库的元组可用 IN,重复使用上述视图来查找所有最新消息:http://www.sqlfiddle.com/#!2/b8193/2

select * 
from tbl
where (page_url,last_modified) in (select page_url, recentDate from page_latest);

输出:

| PAGE_URL |                  LAST_MODIFIED |      MESSAGE |
------------------------------------------------------------
|  abc.com | October, 01 2010 10:00:00+0000 |     no alarm |
|  xyz.com | October, 04 2010 12:10:00+0000 | no surprises |

不仅查询更短,而且更易于阅读。但是,如果您没有可用的视图,可以在查询中内联一个“视图”:http://www.sqlfiddle.com/#!2/b8193/5

select * 
from tbl
where (page_url,last_modified) in

  (SELECT page_url, MAX(last_modified) recentDate
   FROM tbl
   GROUP BY page_url);

这个答案在Sql Server中不起作用。很少有数据库不支持元组-capable的IN,不幸的是Sql Server就是其中之一。


0
SELECT z.page_url,z.last_modified 
FROM (SELECT page_url, MAX(last_modified) 
      FROM my_table 
      GROUP BY page_url) as z 
ORDER BY z.page_url

0
这些怎么样?
    SELECT   page_url,last_modified,other field
    FROM my_table
    ORDER BY page_url,last_modified

或者

   SELECT  distinct page_url,last_modified,other field
   FROM my_table
   ORDER BY page_url,last_modified

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接