Dapatkan n rekod pertama dalam setiap hasil kumpulan
P粉785957729
P粉785957729 2023-08-21 19:55:22
0
2
346

Berikut ialah contoh paling mudah yang mungkin, tetapi sebarang penyelesaian harus dapat menskalakan kepada hasil n teratas yang diperlukan:

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)

+--------+-------+-----+ |. Orang | +--------+-------+-----+ |. 1 | |Jill|1|34| |. Shawn | |. 2 | |. 2 | |. Laura | +--------+-------+-----+

Set hasil yang diingini:

+--------+-------+-----+ |. Shawn | |Jill|1|34| |. Laura | |. 2 | +--------+-------+-----+

Mendapat jawapan khusus MySQL yang baik daripada @Bohemian:

pilih * daripada (pilih * daripada susunan jadual saya mengikut `Kumpulan`, Penerangan umur, Orang) x kumpulan mengikut `Kumpulan`

Alangkah baiknya jika dapat membina perkara ini, tetapi saya tidak dapat melihat caranya.

P粉785957729
P粉785957729

membalas semua (2)
P粉340264283

Dalam pangkalan data lain anda boleh gunakanROW_NUMBER来实现此功能。MySQL不支持ROW_NUMBERtetapi 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


EditSaya 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 menggunakanUNION 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;

    LihatDemo

      Muat turun terkini
      Lagi>
      kesan web
      Kod sumber laman web
      Bahan laman web
      Templat hujung hadapan
      Tentang kita Penafian Sitemap
      Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!