Rumah  >  Soal Jawab  >  teks badan

Dapatkan n rekod pertama dalam setiap hasil kumpulan

<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粉785957729P粉785957729447 hari yang lalu426

membalas semua(2)saya akan balas

  • P粉340264283

    P粉3402642832023-08-22 19:25:52

    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.

    balas
    0
  • P粉404539732

    P粉4045397322023-08-22 13:19:02

    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

    balas
    0
  • Batalbalas