sql >> Databasteknik >  >> RDS >> Mysql

Topp N per grupp med flera bordsanslutningar

Även om du anger LIMIT 100, kommer denna typ av fråga att kräva att en fullständig skanning och tabell byggs upp, och sedan varje post inspekteras och rad numreras innan du slutligen filtrerar efter de 100 som du vill visa.

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;

Tillvägagångssättet här är

  1. Gruppera efter för att få NumSales
  2. Använd variabler för att radnummerera försäljningen per leverantör/produkt
  3. Filtrera den numrerade datamängden för att tillåta max 3 per leverantör
  4. Beställ återstående av NumSales DESC och returnera endast 100


  1. NOT IN i postgresql fungerar inte

  2. Node MySQL escape LIKE-sats

  3. Fel:Metoden eller operationen är inte implementerad. samtidigt som byggnadsställningar MYSQL-databasen

  4. Hur man skapar en tabell i SQL Server