sql >> Database teknologi >  >> RDS >> Mysql

Top N pr. gruppe med flere tabeller

Selvom du angiver LIMIT 100, vil denne type forespørgsel kræve, at en fuld scanning og tabel opbygges, hvorefter hver post inspiceres og række nummereres, før den endelig filtreres for de 100, du vil vise.

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;

Fremgangsmåden her er

  1. Grupper efter for at få NumSales
  2. Brug variabler til at rækkenummerere salget pr. leverandør/produkt
  3. Filtrer det nummererede datasæt for at tillade maks. 3 pr. leverandør
  4. Bestil det resterende af NumSales DESC og returner kun 100


  1. Hvordan sammenkæder jeg hele resultatsæt i MySQL?

  2. Regex-mønster inde i SQL Replace-funktionen?

  3. slet dublerede rækker fra Oracle

  4. MySQL sorteringsrækkefølge efter matrixværdi