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

N Teratas Per Grup dengan Beberapa Tabel Bergabung

Meskipun Anda menentukan LIMIT 100, jenis kueri ini akan memerlukan pemindaian penuh dan tabel untuk dibuat, kemudian setiap record diperiksa dan diberi nomor baris sebelum akhirnya memfilter 100 yang ingin Anda tampilkan.

select
    vendorid, productid, NumSales
from
(
    select
        vendorid, productid, NumSales,
        @r := IF(@g=vendorid,@r+1,1) RowNum,
        @g := vendorid
    from (select @g:=null) initvars
    CROSS JOIN 
    (
        SELECT COUNT(oi.price) AS NumSales, 
               p.productid, 
               p.vendorid
        FROM products p
        INNER JOIN vendors v ON (p.vendorid = v.vendorid)
        INNER JOIN orders_items oi ON (p.productid = oi.productid)
        INNER JOIN orders o ON (oi.orderid = o.orderid)
        WHERE (p.Approved = 1 AND p.Active = 1 AND p.Deleted = 0)
        AND (v.Approved = 1 AND v.Active = 1 AND v.Deleted = 0)
        AND o.`Status` = 'SETTLED'
        AND o.Deleted = 0
        GROUP BY p.vendorid, p.productid
        ORDER BY p.vendorid, NumSales DESC
    ) T
) U
WHERE RowNum <= 3
ORDER BY NumSales DESC
LIMIT 100;

Pendekatannya di sini adalah

  1. Kelompokkan menurut untuk mendapatkan NumSales
  2. Gunakan variabel untuk memberi nomor baris penjualan per vendor/produk
  3. Filter kumpulan data bernomor untuk memungkinkan maksimal 3 per vendor
  4. Pesan sisanya dengan NumSales DESC dan kembalikan hanya 100


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CodeIgniter/PHP/MySQL:Mengambil data dengan JOIN

  2. MySQL DELETE FROM dengan subquery UNION dengan kondisi IN

  3. Mengapa TRANSAKSI / KOMIT meningkatkan kinerja begitu banyak dengan PHP/MySQL (InnoDB)?

  4. Bagaimana cara menyimpan datetime di MySQL dengan info zona waktu

  5. Mengejek kueri penyisipan ke Database MySQL menggunakan Moq