我试图在过去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
答案 0 :(得分:1)
您可以使用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
如果每种产品和语言最多只能有一个描述。