Mengambil semula Rekod Terkini dalam Satu-dengan-Banyak Hubungan SQL
Apabila bekerja dengan perhubungan pangkalan data satu-ke-banyak, memilih rekod terbaharu untuk setiap entiti dengan cekap adalah tugas biasa. Contohnya, anda mungkin perlu memaparkan pelanggan dan pembelian terbaharu mereka dalam satu pertanyaan.
Pendekatan Optimum
Kaedah yang mantap melibatkan penggabungan JOIN
dan 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>
Pertanyaan ini mengenal pasti p1
sebagai pembelian terbaharu. LEFT OUTER JOIN
dengan p2
mencari sebarang pembelian dengan tarikh kemudian atau, jika tarikh adalah sama, ID yang lebih tinggi (menunjukkan entri yang lebih terkini). Baris dengan p2.customer_id
ialah NULL
mewakili pembelian terbaharu untuk setiap pelanggan.
Pengindeksan Pangkalan Data untuk Prestasi
Mencipta indeks komposit pada jadual purchase
menggunakan lajur (customer_id, date, id)
meningkatkan prestasi pertanyaan dengan ketara. Indeks ini mengoptimumkan carian dan bergabung berdasarkan kriteria ini.
Pertimbangan Denormalisasi
Untuk senario yang rumit, penyahnormalan—menambah butiran pembelian terakhir terus pada jadual customer
—mungkin berfaedah. Ini memudahkan pertanyaan dan meningkatkan prestasi untuk kes penggunaan tertentu. Walau bagaimanapun, timbangkan dengan teliti peningkatan prestasi berbanding isu integriti data yang berpotensi dan overhed penyelenggaraan.
Pertanyaan Ringkas untuk ID Susunan Urutan
Jika ID pembelian dijamin dipesan secara berurutan mengikut tarikh, pertanyaan ringkas menggunakan LIMIT
adalah mungkin:
<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>
Pendekatan ini bergantung pada andaian bahawa ID bertindak sebagai jujukan monotonik dalam setiap pembelian pelanggan, membolehkan mendapatkan semula pembelian terkini berdasarkan ID tertinggi. Kaedah ini kurang mantap berbanding pendekatan pertama jika urutan ID tidak dipesan mengikut tarikh.
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Rekod Terakhir dengan Cekap dalam Perhubungan SQL Satu-dengan-Banyak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!