最佳化SQL查詢,有效率地選擇每個類別中的最新項目
資料庫中展示每個類別最新專案的挑戰,需要一個有效率的SQL查詢。雖然逐個類別迭代並查詢最新項目是一種直接的方法,但最好能透過減少資料庫呼叫來優化查詢。
最大-N-每組問題
在類別群組中辨識最新n筆記錄的任務稱為最大-n-每組問題,這是一個常見的SQL查詢問題。
外連接解決方案
使用外連接,我們可以得到所需的結果:
<code class="language-sql">SELECT i1.* FROM item i1 LEFT OUTER JOIN item i2 ON (i1.category_id = i2.category_id AND i1.item_id < i2.item_id) GROUP BY i1.item_id HAVING COUNT(*) < 4;</code>
說明
此查詢在每個項目 (i1) 與比它更新的項目 (i2) 之間執行外連接,只考慮同一類別中的項目。 COUNT(*) 子句決定每個 i1 的較新項目的數量。少於四個較新項目的項目成為我們選擇的合格候選人。
優勢
此解決方案具有靈活性和適應性:
替代方案
另一個使用使用者變數的特定於MySQL的解決方案:
<code class="language-sql">SELECT * FROM ( SELECT i.*, @r := IF(@g = category_id, @r+1, 1) AS rownum, @g := category_id FROM (SELECT @g:=null, @r:=0) AS _init CROSS JOIN item i ORDER BY i.category_id, i.date_listed ) AS t WHERE t.rownum <= 4;</code>
SQL視窗函數
MySQL 8.0.3 引入了視窗函數,允許使用另一種高效的解決方案:
<code class="language-sql">WITH numbered_item AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY item_id) AS rownum FROM item ) SELECT * FROM numbered_item WHERE rownum <= 4;</code>
結論
透過根據您的特定 MySQL 版本和資料庫結構選擇合適的查詢方法,您可以有效地優化每個類別中最新項目的選取。
以上是如何在 SQL 中有效率地選擇每個類別的最新項目?的詳細內容。更多資訊請關注PHP中文網其他相關文章!