Как найти product_id с наибольшим количеством SQL-запросов и наибольшим количеством - PullRequest
0 голосов
/ 27 апреля 2018

Я подаю заявку на управление запасами, и одна из моих функций - создание отчетов.

Я пытаюсь составить базовый отчет о продажах пяти лучших продуктов, но просто не могу понять, как это должно выглядеть.

Пока я могу вернуть max () для count () для таблицы, например,

SELECT MAX(product_quantity) FROM 
(SELECT COUNT(quantity) as product_quantity FROM
sales_products) as derived; 

Теперь, если я добавляю product_id в выборку, я получаю сообщение об ошибке неизвестного поля:

SELECT product_id, MAX(product_quantity) FROM 
    (SELECT COUNT(quantity) as product_quantity FROM
    sales_products) as derived;

У меня два вопроса: почему я получаю неизвестное поле, так как я ссылаюсь на таблицу (пытался использовать имя таблицы или полученный псевдоним) И как получить первые 5 вместо только первого? Большое спасибо за ваше время и терпение!

Ниже приведены изображения поля и структуры данных

DB_ERD

DB_structure

1 Ответ

0 голосов
/ 27 апреля 2018

Если вы хотите товар с наибольшим количеством продаж, попробуйте следующий запрос

SELECT product_id, COUNT(quantity) as product_quantity 
FROM sales_products
GROUP BY product_id
HAVING COUNT(quantity) >= ALL(
    SELECT COUNT(quantity)
    FROM sales_products
    GROUP BY product_id 
)

Как упоминал Дэмиен, вам, вероятно, понадобится сумма quantity больше, чем количество записей sales_products за product_id. Следовательно, в таком случае решение должно быть

SELECT product_id, SUM(quantity) as product_quantity 
FROM sales_products
GROUP BY product_id
HAVING SUM(quantity) >= ALL(
    SELECT SUM(quantity)
    FROM sales_products
    GROUP BY product_id 
)

РЕДАКТИРОВАТЬ: (OP вопрос: Относительно количества результатов, которые я могу получить, как я могу получить топ-5 из них?)

Это может быть немного сложно, так как MySQL не поддерживает LIMIT в ALL/IN/ANY подзапросах. Обходной путь может быть следующим:

SELECT product_id, SUM(quantity) as product_quantity 
FROM sales_products
GROUP BY product_id
HAVING SUM(quantity) >= (
    SELECT MIN(quantity_sum)
    FROM
    (
        SELECT SUM(quantity) quantity_sum
        FROM sales_products
        GROUP BY product_id 
        ORDER BY SUM(quantity) desc
        LIMIT 5
    ) t
)

РЕДАКТИРОВАТЬ 2: , если вас интересует только топ-5, и вы не заботитесь о связях (это означает, что у вас может быть, например, десятка лучших товаров с одинаковым количеством сумм, и вы можете случайным образом выбрать только 5) тогда вы можете использовать это

SELECT product_id, SUM(quantity) as product_quantity 
FROM sales_products
GROUP BY product_id
ORDER BY SUM(quantity) desc
LIMIT 5
...