Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Top N na grupę z wieloma połączeniami tabel

Nawet jeśli określisz LIMIT 100, ten typ zapytania będzie wymagał pełnego skanowania i zbudowania tabeli, a następnie każdego sprawdzanego rekordu i numerowania wiersza przed ostatecznym przefiltrowaniem pod kątem 100, które chcesz wyświetlić.

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;

Podejście tutaj jest

  1. Pogrupuj według, aby uzyskać NumSales
  2. Użyj zmiennych do numerowania wierszy sprzedaży na dostawcę/produkt
  3. Przefiltruj ponumerowany zestaw danych, aby umożliwić maksymalnie 3 na dostawcę
  4. Zamów pozostałe przez NumSales DESC i zwróć tylko 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. Jak dodać więcej niż jeden wiersz za pomocą Zend_Db?

  2. Java pobiera zestaw wyników z tablicy SQL nie działa

  3. Jak przechowywać datę w bazie danych MySQL?

  4. NodeJS/mySQL - ER_ACCESS_DENIED_ERROR Odmowa dostępu dla użytkownika 'root'@'localhost' (przy użyciu hasła:TAK)

  5. Zapytanie, aby uzyskać najniższą wartość, która jest większa od zera, a nie jest NULL