簡體   English   中英

mysql:加入另一個表並獲取最新行

[英]mysql: Join another table and get the latest row

我有 2 個表: urlschecks

網址

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM