Rumah > pangkalan data > tutorial mysql > Bagaimanakah Saya Boleh Mendapatkan Rekod Tertinggi atau Terendah dengan Cekap bagi setiap Kumpulan dalam Pangkalan Data?

Bagaimanakah Saya Boleh Mendapatkan Rekod Tertinggi atau Terendah dengan Cekap bagi setiap Kumpulan dalam Pangkalan Data?

Barbara Streisand
Lepaskan: 2024-12-24 22:08:11
asal
579 orang telah melayarinya

How Can I Efficiently Retrieve the Highest or Lowest Record per Group in a Database?

Mengambil Rekod dengan Tertinggi/Terendah Setiap Kumpulan

Penyata Masalah

Bagaimana seseorang boleh mendapatkan rekod dengan yang tertinggi dengan cekap atau nilai terendah untuk medan tertentu dalam setiap kumpulan yang ditakrifkan oleh yang lain medan?

Penyelesaian Menggunakan Left Outer Join

Untuk mendapatkan semula rekod dengan nilai tertinggi untuk medan OrderField dalam setiap GroupId, gunakan pertanyaan berikut:

SELECT t1.*
FROM `Table` AS t1
LEFT OUTER JOIN `Table` AS t2
  ON t1.GroupId = t2.GroupId AND t1.OrderField < t2.OrderField
WHERE t2.GroupId IS NULL
ORDER BY t1.OrderField;
Salin selepas log masuk

Faedah Menyertai Pendekatan

  • Cekap untuk set data yang besar
  • Menggunakan indeks pada (GroupId, OrderField) jika tersedia
  • Tidak perlu subqueries atau menyusun dalam pertanyaan

Alternatif

Jika data adalah kecil atau pelaksanaan khusus enjin pangkalan data yang anda gunakan kurang dioptimumkan untuk gabungan, anda boleh mempertimbangkan alternatif seperti sebagai:

  • Menggunakan Subquery: Ini melibatkan penggunaan subquery untuk mengira nilai maksimum bagi setiap kumpulan dan kemudian menyertai subquery ini ke jadual utama untuk mendapatkan semula rekod yang sepadan.
  • Menggunakan Fungsi Kedudukan: Ini melibatkan penggunaan fungsi tetingkap untuk mengira kedudukan setiap rekod dalam setiap kumpulan dan kemudian penapisan berdasarkan pangkat.

Ketidakcekapan Penggunaan Kaedah @Rank Variable

Kaedah yang anda huraikan menggunakan pembolehubah @Rank, seperti yang ditulis pada asalnya, tidak akan berfungsi dengan betul kerana pembolehubah @Rank tidak ditetapkan semula kepada sifar selepas memproses jadual pertama. Untuk membetulkannya, anda perlu menambah jadual terbitan lain untuk menetapkan semula @Rank kepada sifar sebelum memproses jadual kedua. Walau bagaimanapun, pendekatan ini masih tidak cekap berbanding pendekatan bergabung.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mendapatkan Rekod Tertinggi atau Terendah dengan Cekap bagi setiap Kumpulan dalam Pangkalan Data?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan