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

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

DDD
DDD原創
2025-01-22 02:10:09989瀏覽

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

最佳化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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn