按销售额在30天内订购产品,然后是没有销售的产品

时间:2018-01-18 14:59:48

标签: php mysql date sql-order-by

我试图在过去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

1 个答案:

答案 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天内通过销售来订购文章的内容。例如,这可以是历史销售数量。

我还会为你的所有表使用别名(就像你为第一个表所做的那样)。 oordersoporders_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列表中会很好。

关于SQL的一些注意事项:

由于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

如果每种产品和语言最多只能有一个描述。