[英]mysql: Join another table and get the latest row
我有 2 個表: urls和checks 。
網址
id | url
-----------------------
1 | google.com
2 | amazon.com
3 | stackoverflow.com
支票
time 是時間戳列,status 是文本
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
如何創建查詢以獲取表 'urls' 中的所有 url 和 'checks' 中的最新條目? 表通過 urls.id = checks.url_id 連接。 如果 url 的“檢查”中沒有條目,則返回“NULL”。
Output 示例:
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
現在我在 php pdo 中使用這種方式(可能是一些拼寫錯誤,不是一個真實的例子):
$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']));
....
}
在 1 個查詢而不是一個循環中獲得結果是否更好更快?
服務器版本:
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 $
謝謝。
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)
您可以嘗試在一行中使用 SQL,我建議您進行以下查詢:
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);
在這種情況下,您擁有實際的 urls 表並從檢查中加入最新的行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.