Я пытаюсь получить список продуктов, заказанных проданным количеством за последние 30 дней.
Как я могу сделать следующий запрос и заказать по количеству продаж за последние 30 дней, а за ними следуют продукты, которые ничего не продали за эти 30 дней?
Мне нужны те, у кого есть продажа в течение последних 30 дней, а затем без каких-либо продаж.
Поле с датой продажи - это поле datetime
называемое orders.sold_time
Это мой текущий запрос:
SELECT pd.products_id AS id, pd.products_name AS name
FROM products_description pd
LEFT JOIN products ON pd.products_id = products.products_id
LEFT JOIN orders_products ON pd.products_id = orders_products.products_id
LEFT JOIN orders ON orders_products.orders_id = orders.orders_id
WHERE pd.c5_dataset = 'DAT'
AND products.products_status =1
AND pd.language_id =4
AND NOT EXISTS (
SELECT 1
FROM products_description
WHERE products_id = pd.products_id
AND language_id = 10
)
AND orders_total.class = 'ot_total'
GROUP BY pd.products_id
ORDER BY count( orders_products.products_quantity ) DESC
Вы можете использовать case when
выражение для этого. Выражение, которое дает вам проданное количество за последние 30 дней:
sum(case when orders.sold_time >= date_add(curdate(), interval -30 day)
then orders_products.products_quantity
end)
Вы можете поместить это в оговорку по order by
, а затем вы должны решить, что заказывать статьи, у которых нет продаж за последние 30 дней. Это может быть, например, все время проданного количества.
Я бы также использовал псевдонимы для всех ваших таблиц (как и для первого). Так что o
для orders
, op
для orders_products
.
Тогда ваш order by
будет выглядеть так:
order by sum(case when o.sold_time >= date_add(curdate(), interval -30 day)
then op.products_quantity
end),
sum(op.products_quantity)
Чтобы проверить результаты, было бы неплохо добавить эти два выражения в список select
.
Поскольку у вас есть ненулевое условие для products.products_status
(= 1), нет веских оснований использовать LEFT JOIN products
. Вместо этого используйте более эффективный INNER JOIN
.
Вероятно, вы получите эффективность, если вы замените условие NOT EXISTS
на предложение INNER JOIN
:
INNER JOIN products_description p2
ON p2.products_id = pd.products_id
AND p2.language_id = 10
при условии, что может быть не более одного описания для каждого продукта и языка.