Dapatkan n rekod pertama dalam setiap hasil kumpulan
P粉785957729
P粉785957729 2023-08-21 19:55:22
0
2
456
<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>

P粉785957729
P粉785957729

membalas semua(2)
P粉340264283

Dalam pangkalan data lain anda boleh gunakan ROW_NUMBER来实现此功能。MySQL不支持ROW_NUMBER tetapi anda boleh mensimulasikannya menggunakan pembolehubah:

SELECT
    person,
    groupname,
    age
FROM
(
    SELECT
        person,
        groupname,
        age,
        @rn := IF(@prev = groupname, @rn + 1, 1) AS rn,
        @prev := groupname
    FROM mytable
    JOIN (SELECT @prev := NULL, @rn := 0) AS vars
    ORDER BY groupname, age DESC, person
) AS T1
WHERE rn <= 2

Demo dalam talian: sqlfiddle


Edit Saya baru perasan bahawa bluefeet menyiarkan jawapan yang hampir serupa: +1 kepadanya. Tetapi jawapan ini mempunyai dua kelebihan kecil:

  1. Ini adalah satu pertanyaan. Pembolehubah dimulakan di dalam pernyataan SELECT.
  2. Ia mengendalikan situasi selari yang diterangkan dalam soalan (dalam susunan abjad mengikut nama).

Jadi saya akan menyimpannya sekiranya ia membantu seseorang.

P粉404539732

Berikut ialah cara untuk menambah pertanyaan menggunakan UNION ALL(请参见带有演示的SQL Fiddle)。这适用于两个组,如果你有多个组,则需要指定group编号并为每个group:

(
  select *
  from mytable 
  where `group` = 1
  order by age desc
  LIMIT 2
)
UNION ALL
(
  select *
  from mytable 
  where `group` = 2
  order by age desc
  LIMIT 2
)

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:

select person, `group`, age
from 
(
   select person, `group`, age,
      (@num:=if(@group = `group`, @num +1, if(@group := `group`, 1, 1))) row_number 
  from test t
  CROSS JOIN (select @num:=0, @group:=null) c
  order by `Group`, Age desc, person
) as x 
where x.row_number <= 2;

Lihat Demo

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan