如何有效率地檢索一對多 SQL 關係中的最後一筆記錄?
Jan 19, 2025 pm 12:26 PM用於擷取一對多關係中最新記錄的 SQL 連線
資料庫查詢通常涉及從一對多關係中檢索最新條目。 想像一個包含「客戶」和「購買」表的資料庫;每次購買都屬於單一客戶。 此方法使用單一 SELECT 語句有效地擷取客戶清單及其最近的購買行為:
SELECT c.*, p1.* FROM customer c JOIN purchase p1 ON (c.id = p1.customer_id) LEFT OUTER JOIN purchase p2 ON (c.id = p2.customer_id AND p1.date < p2.date) WHERE p2.customer_id IS NULL;
登入後複製
說明:
- INNER JOIN 透過「customer_id」連結「customer」和「purchase」表,將客戶與其購買關聯起來。
- 左外連線標識每位客戶在以後的日期進行的額外購買。
- WHERE 子句過濾掉這些附加條目,僅保留每位客戶最近購買的內容。
效能最佳化:索引
為了獲得最佳效能,請使用欄位「(customer_id, date, id)」在「purchase」表上建立複合索引。這樣可以根據客戶、日期和 ID 進行高效率的資料庫搜尋。
非規範化權衡:
將上次購買日期儲存在「客戶」表中(非規範化)可以提高頻繁的上次購買查詢的效能。 然而,這引入了數據冗餘和潛在的完整性問題。
LIMIT 1 子句:較不可靠的替代方案
如果「購買」表 ID 始終按日期排序,則在子查詢中使用 LIMIT 1
可以簡化查詢。 但是,此方法的可靠性不如 LEFT OUTER JOIN 方法一致。 LEFT OUTER JOIN 方法因其穩健性而通常是首選。
以上是如何有效率地檢索一對多 SQL 關係中的最後一筆記錄?的詳細內容。更多資訊請關注PHP中文網其他相關文章!
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章
擊敗分裂小說需要多長時間?
3 週前
By DDD
倉庫:如何復興隊友
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前
By 尊渡假赌尊渡假赌尊渡假赌
公眾號網頁更新緩存難題:如何避免版本更新後舊緩存影響用戶體驗?
3 週前
By 王林

熱門文章
擊敗分裂小說需要多長時間?
3 週前
By DDD
倉庫:如何復興隊友
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前
By 尊渡假赌尊渡假赌尊渡假赌
公眾號網頁更新緩存難題:如何避免版本更新後舊緩存影響用戶體驗?
3 週前
By 王林

熱門文章標籤

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在 Linux 中運行 MySQl(有/沒有帶有 phpmyadmin 的 podman 容器)
