2016-11-28 116 views
0

我有一个表存储一些有关URL的报告,他们有一个像created_date这样的字段。可以多次生成(并存储)相同的报告,因为这些值可能会更改。我怎样才能获得网址报告,但只有最新的?如何从MySQL获取最新记录?

我的表(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; 

但它很慢。有没有更好的方法?

希望我提前明确表示感谢!

+1

查询马克斯(CREATED_DATE)。 –

+0

如果URL更改......您如何知道哪些记录与彼此有关? – xQbert

+0

Plz提供样本数据和您的期望输出。 – MasoodUrRehman

回答

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; 
1

一种方法是通过某些ID /逻辑密钥生成最大记录的日期集。

如果我假设了一个名为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或其他一些随着时间的推移会保持不变的属性?

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了解详情。

-1

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

​​