<p>Berikut ialah contoh paling mudah yang mungkin, tetapi sebarang penyelesaian harus dapat menskalakan kepada hasil n teratas yang diperlukan: </p>
<p>Memandangkan jadual berikut, yang mengandungi lajur untuk orang, kumpulan dan umur, bagaimanakah anda mendapatkan 2 orang tertua dalam setiap kumpulan? (Ikatan dalam kumpulan tidak seharusnya menghasilkan lebih banyak hasil, sebaliknya memberikan 2 teratas dalam susunan abjad) </p>
<pra>
+--------+-------+-----+
|. Orang |
+--------+-------+-----+
|. 1 |
|Jill|1|34|
|. Shawn |
|. 2 |
|. 2 |
|. Laura |
+--------+-------+-----+
</pra>
<p>Set hasil yang diingini: </p>
<pra>
+--------+-------+-----+
|. Shawn |
|Jill|1|34|
|. Laura |
|. 2 |
+--------+-------+-----+
</pra>
<hr>
Mendapat jawapan khusus MySQL yang baik daripada @Bohemian: </p>
<pre class="brush:php;toolbar:false;">pilih *
daripada (pilih * daripada susunan jadual saya mengikut `Kumpulan`, Penerangan umur, Orang) x
kumpulan mengikut `Kumpulan`</pre>
<p>Alangkah baiknya jika dapat membina perkara ini, tetapi saya tidak dapat melihat caranya. </p>
Dalam pangkalan data lain anda boleh gunakan
ROW_NUMBER
来实现此功能。MySQL不支持ROW_NUMBER
tetapi anda boleh mensimulasikannya menggunakan pembolehubah:Demo dalam talian: sqlfiddle
Edit Saya baru perasan bahawa bluefeet menyiarkan jawapan yang hampir serupa: +1 kepadanya. Tetapi jawapan ini mempunyai dua kelebihan kecil:
Jadi saya akan menyimpannya sekiranya ia membantu seseorang.
Berikut ialah cara untuk menambah pertanyaan menggunakan
UNION ALL
(请参见带有演示的SQL Fiddle)。这适用于两个组,如果你有多个组,则需要指定group
编号并为每个group
:Terdapat pelbagai cara untuk mencapai matlamat ini, sila rujuk artikel ini untuk menentukan kaedah terbaik untuk situasi anda:
http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/
Editor:
Ini mungkin berfungsi untuk anda juga, ia menjana nombor baris untuk setiap rekod. Menggunakan contoh daripada pautan di atas, ia hanya akan mengembalikan rekod dengan nombor baris kurang daripada atau sama dengan 2:
Lihat Demo