简体   繁体   中英

mysql: Join another table and get the latest row

I have 2 tables: urls and checks .

urls

id | url
-----------------------
1  | google.com
2  | amazon.com
3  | stackoverflow.com

checks

time is a timestamp column, status is text

id | url_id | status | time
------------------------------------------
1  | 1      | true   | 2021-01-11 19:20:00
2  | 2      | false  | 2021-01-12 19:20:00
3  | 2      | true   | 2021-01-13 19:20:00
4  | 1      | false  | 2021-01-14 19:20:00

How to create a query to get all urls from the table 'urls' and the latest entry from 'checks'? Tables are connected by urls.id = checks.url_id. And if there is no entry in 'checks' for the url return 'NULL'.

Output example:

id | url               | status | time
-----------------------------------------------------
1  | google.com        | false  | 2021-01-14 19:20:00
2  | amazon.com        | true   | 2021-01-13 19:20:00
3  | stackoverflow.com | NULL   | NULL

Now I'm using this way in php pdo (could be some typo mistakes not a real example):

$r = $db->prepare('SELECT * FROM urls');
$r->execute(array());
while ($row = $r->fetch()) {
  $r2 = $db->prepare('SELECT * FROM checks WHERE url_id = ? ORDER BY time DESC LIMIT 1');
  $r2->execute(array($row['id']));
  ....
}

Is it better and faster to get the result in 1 query instead of a cycle?

Server version:

Server: MySQL (Localhost via UNIX socket)
Server type: MariaDB
Server version: 10.1.44-MariaDB-0+deb9u1 - Debian 9.11
Protocol version: 10
Database client version: libmysql - mysqlnd 5.0.12-dev - 20150407 - $Id: b5c5906d452ec590732a93b051f3827e02749b83 $

Thanks.

SELECT urls.id, urls.url, checks.status, checks.time
FROM urls
LEFT JOIN ( SELECT url_id, MAX(time) time
            FROM checks
            GROUP BY 1 ) last_times ON urls.id = last_times.url_id
LEFT JOIN checks USING (url_id, time)

fiddle

You can try with a SQL in one line, I suggest you this query:

SELECT U.*, CK.status, CK.time FROM urls U LEFT JOIN checks CK ON CK.ID = (SELECT CK2.id FROM checks CK2 WHERE CK2.url_id=U.id ORDER BY CK2.time DESC LIMIT 1);

In this case you have the actual urls table and join the most recent row from checks.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM