Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Dapatkan Item Terbaru daripada Berbilang Kategori Menggunakan Pertanyaan SQL Tunggal?

Bagaimanakah Saya Boleh Dapatkan Item Terbaru daripada Berbilang Kategori Menggunakan Pertanyaan SQL Tunggal?

Linda Hamilton
Linda Hamiltonasal
2025-01-22 02:06:12675semak imbas

How Can I Retrieve the Newest Items from Multiple Categories Using a Single SQL Query?

Pertanyaan SQL Tunggal untuk Mendapatkan Kembali Item Terkini daripada Pelbagai Kategori

Artikel ini membentangkan penyelesaian SQL yang cekap untuk mendapatkan semula item terbaharu merentas berbilang kategori menggunakan pertanyaan pangkalan data tunggal, meminimumkan panggilan pangkalan data.

Penyelesaian SQL: Memanfaatkan Sambungan Luar

Masalah "terhebat-n-per-kumpulan" diselesaikan dengan elegan menggunakan sambungan luar:

<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(i2.item_id) < 4;</code>

Pertanyaan ini cekap memilih item dengan kurang daripada empat item baharu dalam kategori masing-masing.

Penjelasan:

Pertanyaan itu menggabungkan setiap item (i1) dengan item lain (i2) dalam kategori yang sama yang mempunyai item_id yang lebih tinggi (bermaksud ia lebih baharu). Fasal HAVING menapis item dengan tiga atau lebih item baharu, meninggalkan hanya empat item terbaharu bagi setiap kategori.

Kelebihan:

  • Skalabiliti: Mengendalikan sebarang bilangan kategori dengan berkesan.
  • Keteguhan: Berfungsi dengan betul walaupun dengan bilangan item yang berbeza bagi setiap kategori atau perubahan pada struktur kategori.

Pendekatan Alternatif:

  • Pembolehubah Pengguna MySQL:

Kaedah ini menggunakan pembolehubah takrif pengguna MySQL untuk menetapkan nombor baris dan mengenal pasti empat item terbaharu bagi setiap kategori. (Pendekatan ini kurang mudah alih berbanding kaedah sambung luar).

  • Fungsi Tetingkap (MySQL 8.0.3 dan lebih baru):

MySQL 8.0.3 menyokong fungsi tetingkap SQL standard, memberikan penyelesaian yang lebih ringkas:

<code class="language-sql">WITH numbered_item AS (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY item_id DESC) AS rownum
  FROM item
)
SELECT * FROM numbered_item WHERE rownum <= 4;</code>

Pendekatan ini membahagikan item mengikut kategori, menetapkan nombor baris berdasarkan item_id (dalam susunan menurun untuk yang terbaharu dahulu), dan kemudian memilih empat baris teratas daripada setiap partition.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Dapatkan Item Terbaru daripada Berbilang Kategori Menggunakan Pertanyaan SQL Tunggal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn