sql >> Databáze >  >> RDS >> Mysql

Top N na skupinu s více spojeními ke stolu

I když zadáte LIMIT 100, tento typ dotazu bude vyžadovat úplné prohledání a vytvoření tabulky, poté bude každý záznam zkontrolován a očíslován řádek, než se nakonec vyfiltruje těch 100, které chcete zobrazit.

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;

Zde je přístup

  1. Seskupit podle a získat NumSales
  2. Pomocí proměnných zadejte číslo řádku prodeje podle dodavatele/produktu
  3. Filtrujte očíslovanou datovou sadu tak, aby byla povolena maximálně 3 na dodavatele
  4. Objednejte zbývající u NumSales DESC a vraťte pouze 100


  1. Kód chyby:1822. Nepodařilo se přidat omezení cizího klíče. Chybějící index pro omezení

  2. ERROR 2003 (HY000):Nelze se připojit k serveru MySQL na localhost (10061)

  3. Jak lze porazit sanitaci bez jednoduchých uvozovek injekcí SQL na serveru SQL?

  4. Importujte data.sql MySQL Docker Container