首頁 > 資料庫 > mysql教程 > 如何在 SQL 中有效率地選擇每個類別的最新項目?

如何在 SQL 中有效率地選擇每個類別的最新項目?

DDD
發布: 2025-01-22 02:10:09
原創
1052 人瀏覽過

How Can I Efficiently Select the Latest Items per Category in SQL?

最佳化SQL查詢,有效率地選擇每個類別中的最新項目

資料庫中展示每個類別最新專案的挑戰,需要一個有效率的SQL查詢。雖然逐個類別迭代並查詢最新項目是一種直接的方法,但最好能透過減少資料庫呼叫來優化查詢。

最大-N-每組問題

在類別群組中辨識最新n筆記錄的任務稱為最大-n-每組問題,這是一個常見的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;
登入後複製

說明

此查詢在每個項目 (i1) 與比它更新的項目 (i2) 之間執行外連接,只考慮同一類別中的項目。 COUNT(*) 子句決定每個 i1 的較新項目的數量。少於四個較新項目的項目成為我們選擇的合格候選人。

優勢

此解決方案具有靈活性和適應性:

  • 可輕鬆處理任意數量的類別
  • 不會受類別修改的影響
  • 可處理項目數量不同的類別

替代方案

另一個使用使用者變數的特定於MySQL的解決方案:

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;
登入後複製

SQL視窗函數

MySQL 8.0.3 引入了視窗函數,允許使用另一種高效的解決方案:

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;
登入後複製

結論

透過根據您的特定 MySQL 版本和資料庫結構選擇合適的查詢方法,您可以有效地優化每個類別中最新項目的選取。

以上是如何在 SQL 中有效率地選擇每個類別的最新項目?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板