Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Mendapatkan Rekod Terakhir dengan Cekap dalam Perhubungan SQL Satu-dengan-Banyak?

Bagaimana untuk Mendapatkan Rekod Terakhir dengan Cekap dalam Perhubungan SQL Satu-dengan-Banyak?

DDD
Lepaskan: 2025-01-19 12:13:09
asal
264 orang telah melayarinya

How to Efficiently Retrieve the Last Record in One-to-Many SQL Relationships?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan