Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL SELECT n bản ghi dựa trên GROUP BY

Dữ liệu mẫu

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;

Tùy chọn đầu tiên là xếp hạng giả sử dụng các biến như The Scrum Meister đã hiển thị, nhưng được trình bày ở đây dưới dạng một câu lệnh duy nhất

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;

Nếu bạn đang sử dụng điều này trong giao diện người dùng và chỉ cần 2 số đếm, thì bạn có thể sử dụng biểu mẫu này để trả về số lượng trong một danh sách (cột đơn)

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

Kết quả là

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

Nếu có thể xảy ra ràng buộc, thì biến thể này của biểu mẫu thứ 2 sẽ xóa các ràng buộc và hiển thị "2 số khác biệt hàng đầu cho mỗi quốc gia", dưới dạng bản ghi.

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

Kết quả

"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. DAO.Recordset.Update kết quả trong khóa tính toán

  2. Thủ tục lưu trữ MySql:Làm thế nào để chọn từ bảng thủ tục?

  3. MySQL:CẬP NHẬT bảng với COUNT từ một bảng khác?

  4. Thứ tự MySQL trước khi Nhóm theo

  5. Cân bằng tải với ProxySQL cho Percona XtraDB Cluster