sql >> Databasteknik >  >> RDS >> Mysql

MySQL SELECT n poster baserat på GROUP BY

Exempeldata

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;

Det första alternativet är en pseudorankning som använder variabler som The Scrum Meister har visat, men presenteras här som ett enda uttalande

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;

Om du använder detta i ett användargränssnitt och bara behöver 2 räkningar, kan du använda det här formuläret som returnerar räkningarna i en lista (en kolumn)

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

Resultatet är

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

Om det är möjligt för oavgjorda siffror att uppstå, tar denna variant av den andra formen bort banden och visar "de två främsta distinkta siffrorna per land", som poster.

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

Resultat

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


  1. SQLite JSON_REMOVE()

  2. Använder du Excel för din databas? Här är varför du bör uppgradera till Access

  3. Hur man listar alla vyer i Oracle Database

  4. Hantera transaktioner i MySQL