Mysql
 sql >> база данни >  >> RDS >> Mysql

Топ N на група с множество свързвания на таблици

Въпреки че сте посочили LIMIT 100, този тип заявка ще изисква пълно сканиране и създаване на таблица, след което всеки проверен запис и номериран ред, преди окончателно да се филтрира за 100, които искате да покажете.

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;

Подходът тук е

  1. Групирайте по, за да получите NumSales
  2. Използвайте променливи за номериране на продажбите на доставчик/продукт
  3. Филтрирайте номерирания набор от данни, за да позволите максимум 3 на доставчик
  4. Поръчайте останалите от NumSales DESC и върнете само 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. Броят на обвързаните променливи на PHP Mysql PDO не съвпада с броя на токените

  2. Свържете се с отдалечен MySQL db от докер контейнер

  3. Заявка за намиране на публикации с точен набор от тагове (връзка много към много)

  4. конвертиране на низ в дата php

  5. Вмъкване на множество стойности в MySQL наведнъж