如何从MySQL获取最新记录?

时间:2016-11-28 18:06:58

标签: mysql sql

我有一个表存储一些关于网址的报告,他们有一个像created_date这样的字段。可以多次生成(和存储)相同的报告,因为值可以更改。我如何获得网址报告,但只是最新报告?

我的桌子(page_report):

id INT PK
url VARCHAR(255)
created_date TIMESTAMP

示例数据:

id    url          created_date
1     google.com   2016-11-01
2     google.com   2016-11-05
3     bing.com     2016-11-03
4     bing.com     2016-11-06

我需要:

id    url          created_date
1     google.com   2016-11-05
2     bing.com     2016-11-06

到目前为止我所拥有的:

SELECT r1.*
FROM page_report r1
LEFT JOIN page_report r2 ON r1.url = r2.url AND r1.created_date < r2.created_date
WHERE r2.url IS NULL;

但它很慢。还有更好的办法吗?

希望我事先明确并表示感谢!

4 个答案:

答案 0 :(得分:1)

一种方法是通过Some ID / Logical Key生成最大记录的日期集。

如果我假设一个名为ID的字段是网址的分组机制......

SELECT T1.URL, T1.Created_Date
FROM TableEName T1
INNER JOIN (SELECT MAX(Created_Date) CD, ID
            FROM TableName 
            GROUP BY ID)
 on T1.ID = T2.ID
and T1.Created_Date = T2.CD

这里的诀窍是我们如何知道URL“已更改”它们是否具有相同的ID或其他一些随时间保持不变的属性?

答案 1 :(得分:0)

使用UNION ALL,然后按url分组,然后选择MAX(created_date)

SELECT t.url, MAX(t.created_date) 
FROM (SELECT * FROM table1 UNION ALL SELECT * FROM table2) t
GROUP BY t.url

有关详细信息,请参阅myql's UNION documentation

答案 2 :(得分:0)

我一直跟这个:

SELECT DISTINCT r1.url FROM page_report r1
    LEFT JOIN page_report r2 ON r1.url = r2.url AND r1.created_date < r2.created_date
    WHERE r2.url IS NULL;

答案 3 :(得分:-1)

为最新的创建日期创建排名函数。像下面的东西。

select * from (select distinct DENSE_RANK () OVER (PARTITION BY url   ORDER BY B.CreatedDate desc) Rnk, t.url  )
where rnk =1