Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL SELECT n mencatat berdasarkan GROUP BY

Contoh data

create table data (Country varchar(10), Number int);
insert into data select
'USA' , 300 union all select
'USA' , 450 union all select
'USA' , 500 union all select
'USA' , 100 union all select
'FR'  , 100 union all select
'FR'  , 420 union all select
'UK'  , 300 union all select
'UK'  , 400 union all select
'UK'  , 1000;

Opsi pertama adalah peringkat semu menggunakan variabel seperti yang ditunjukkan oleh The Scrum Meister, tetapi disajikan di sini sebagai satu pernyataan

SELECT Country, Number
FROM (
    SELECT
        Number,
        @r := case when @c=country then @r+1 else 1 end rownum,
        @c := Country Country 
    FROM (select @r :=0 , @c := '') x, data
    ORDER BY Country, Number DESC
) y
WHERE rownum < 3;

Jika Anda menggunakan ini di front end, dan hanya membutuhkan 2 hitungan, maka Anda dapat menggunakan formulir ini yang mengembalikan hitungan dalam daftar (kolom tunggal)

SELECT
    Country,
    left(x,locate(',',concat(x,','),locate(',',x)+1)-1) Numbers
FROM (
    SELECT
        a.Country,
        Group_Concat(a.Number) x
    From (
        select country, number
        from data
        order by country, number desc) a
    group by a.Country
) b

Hasilnya adalah

"Country";"Numbers"
"FR";"420,100"
"UK";"1000,400"
"USA";"500,450"

Jika memungkinkan untuk terjadi ikatan, maka variasi dari bentuk ke-2 ini menghilangkan ikatan dan menunjukkan "2 angka berbeda teratas per negara", sebagai catatan.

SELECT distinct x.Country, x.Number
From data x
inner join
(
    SELECT
        Country,
        left(x,locate(',',concat(x,','),locate(',',x)+1)-1) Numbers
    FROM (
        SELECT
            a.Country,
            Group_Concat(a.Number) x
        From (
            select distinct country, number
            from data
            order by country, number desc) a
        group by a.Country
    ) b
) y on x.Country=y.Country
    and concat(',',y.Numbers,',') like concat('%,',x.Number,',%')
order by x.Country, x.Number Desc

Hasil

"Country";"Number"
"FR";"420"
"FR";"100"
"UK";"1000"
"UK";"400"
"USA";"500"
"USA";"450"


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menyisipkan gambar dalam gumpalan di tabel mysql hanya menggunakan sintaks sql (tanpa PHP)?

  2. Hapus tabel di MySQL

  3. Bagaimana cara mengatasi nama kolom yang ambigu saat mengambil hasil?

  4. Cara membagi kolom yang dihasilkan menjadi beberapa kolom

  5. PathExpression tidak valid. Harus berupa StateFieldPathExpression