擷取一對多 SQL 關係中的最新記錄
處理一對多資料庫關係時,為每個實體有效選擇最新記錄是一項常見任務。 例如,您可能需要在單一查詢中顯示客戶及其最新購買的商品。
最佳方法
穩健的方法涉及組合 JOIN
和 LEFT OUTER JOIN
:
<code class="language-sql">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 OR (p1.date = p2.date AND p1.id < p2.id)) WHERE p2.customer_id IS NULL;</code>
此查詢將 p1
標識為最新購買。帶有 LEFT OUTER JOIN
的 p2
搜尋任何較晚日期的購買,或如果日期相同,則搜尋更高 ID(表示較新的條目)。 p2.customer_id
為 NULL
的行代表每個客戶的最新購買。
資料庫索引以提高效能
使用列 purchase
在 (customer_id, date, id)
表上建立複合索引可顯著提高查詢效能。此索引根據這些條件最佳化查找和連接。
非規範化注意事項
對於複雜的場景,非規範化(將上次購買詳細資訊直接添加到 customer
表中)可能會更有利。這簡化了查詢並增強了特定用例的效能。 但是,請仔細權衡效能提升與潛在資料完整性問題和維護開銷。
順序 ID 的簡化查詢
如果保證購買 ID 按日期順序排序,則可以使用 LIMIT
進行簡化查詢:
<code class="language-sql">SELECT c.*, pu.* FROM customer c JOIN purchase pu ON (c.id = pu.customer_id) ORDER BY pu.id DESC LIMIT 1;</code>
此方法依賴於這樣的假設:ID 在每個客戶的購買中充當單調序列,從而允許根據最高 ID 檢索最新的購買。 如果 ID 序列沒有嚴格按日期排序,則此方法不如第一種方法穩健。
以上是如何有效率地檢索一對多SQL關係中的最後一筆記錄?的詳細內容。更多資訊請關注PHP中文網其他相關文章!