Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Mendapatkan Rekod Terakhir dengan Cekap dalam Hubungan Satu-dengan-Banyak Menggunakan Operasi Berbilang Gabungan?

Bagaimana untuk Mendapatkan Rekod Terakhir dengan Cekap dalam Hubungan Satu-dengan-Banyak Menggunakan Operasi Berbilang Gabungan?

Patricia Arquette
Lepaskan: 2025-01-19 12:17:09
asal
884 orang telah melayarinya

How to Efficiently Retrieve the Last Record in One-to-Many Relationships Using Multiple Join Operations?

Mengoptimumkan Pencapaian Rekod Terakhir dalam Hubungan Satu-dengan-Banyak Pangkalan Data

Mengambil semula rekod terbaharu untuk setiap kumpulan dalam hubungan pangkalan data satu-ke-banyak dengan cekap (cth., pelanggan dan pembelian mereka) ialah tugas manipulasi data yang biasa. Artikel ini meneroka strategi pertanyaan yang berkesan menggunakan operasi gabungan.

Pembinaan dan Penambahbaikan Pertanyaan

Pertanyaan berikut mendapatkan semula butiran pembelian terakhir untuk setiap pelanggan:

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)
WHERE p2.id IS NULL;
Salin selepas log masuk

Pertanyaan ini menggunakan LEFT OUTER JOIN untuk membandingkan setiap pembelian dengan pembelian lain daripada pelanggan yang sama. Fasal WHERE menapis hasil, memastikan hanya pembelian terkini (jika tiada pembelian kemudian) disertakan.

Pengoptimuman Indeks

Untuk prestasi pertanyaan yang optimum, buat indeks kompaun pada jadual purchase menggunakan lajur ini: (customer_id, date, id). Indeks penutup ini mempercepatkan operasi cantum, mengelakkan imbasan jadual tambahan.

Pertimbangan Denormalisasi: Pertukaran

Menambah lajur "last_purchase" pada jadual customer (penyahnormalan) memudahkan pertanyaan tetapi memperkenalkan lebihan data dan kemungkinan anomali kemas kini. Pertimbangkan dengan teliti implikasi sebelum melaksanakan pendekatan ini; ia secara amnya hanya berfaedah jika pertanyaan sedemikian sangat kerap.

Pertanyaan Ringkas dengan ID Isih

Jika lajur purchase jadual id tersusun mengikut tarikh (menurun), pertanyaan ringkas menggunakan LIMIT menjadi boleh dilaksanakan:

SELECT c.*, p1.*
FROM customer c
JOIN purchase p1 ON (c.id = p1.customer_id)
WHERE p1.id = (
    SELECT MAX(id)
    FROM purchase
    WHERE customer_id = c.id
)
LIMIT 1;
Salin selepas log masuk

Walau bagaimanapun, ingat bahawa ini bergantung pada pesanan konsisten lajur id yang menggambarkan pembelian "terkini". Sebarang penyelewengan daripada pesanan ini akan menghasilkan keputusan yang salah.

Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Rekod Terakhir dengan Cekap dalam Hubungan Satu-dengan-Banyak Menggunakan Operasi Berbilang Gabungan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan