2016-11-28 4 views
0

Ich habe eine Tabelle, die einige Berichte über eine URL speichert und sie haben ein Feld wie created_date. Derselbe Bericht kann mehrmals generiert (und gespeichert) werden, da sich die Werte ändern können. Wie kann ich die URL-Berichte abrufen, aber nur die neuesten?Wie erhalten Sie die neuesten Datensätze von MySQL?

Mein Tisch (page_report):

id INT PK 
url VARCHAR(255) 
created_date TIMESTAMP 

Beispieldaten:

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 

ich brauche:

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

Was ich habe, so weit:

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; 

Aber es ist sehr langsam. Gibt es einen besseren Weg?

Hoffe, ich machte mich klar und danke im Voraus!

+1

abfragen Max (created_date). –

+0

Wenn sich die URL ändert ... woher wissen Sie, welche Datensätze zueinander gehören? – xQbert

+0

Plz liefern Beispieldaten und Ihre Wunschausgabe. – MasoodUrRehman

Antwort

0

Ich hielt mit dieser:

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

Eine Möglichkeit besteht darin, eine Datumssatz der max Datensätze durch einige ID/Logical Key zu generieren.

Wenn ich ein Feld namens ID annehmen ist der Gruppierungsmechanismus für die Urls ...

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 

Der Trick hier ist, wie wir wissen, eine URL „Changed“ würden sie die gleiche ID oder eine andere haben Attribut, das im Laufe der Zeit konstant bleiben würde?

0

Verwenden Sie UNION ALL und gruppieren Sie dann nach url und wählen Sie MAX(created_date).

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

Siehe die myql's UNION documentation für Details.

-1

Erstellen Sie eine Rangfunktion für das neueste Erstellungsdatum. Etwas wie unten.

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