【问题标题】:Order products by sales within 30 days followed by those without sales在 30 天内按销售额订购产品,然后在 30 天内按无销售额订购产品
【发布时间】:2018-01-18 14:59:47
【问题描述】:

我正在尝试获取过去 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

【问题讨论】:

  • 您是说您需要最近 30 天的销售额吗?
  • “最近 30 天订购”:这是什么意思?您想在最近的销售日期之前订购吗?如果您还想查看过去 30 天内没有销售的记录,那么您就是说您想要所有东西,那么为什么不按降序排序呢?或者你在这里说什么?
  • @trincot 我想要所有产品,即使是那些没有任何销售的产品,按过去 30 天内最畅销的商品排序 - 所以,所有商品,不受日期间隔限制 - 但按销量最高的方式排序过去 30 天内的项目首先出现在输出中

标签: php mysql date sql-order-by


【解决方案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 对应ordersop 对应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 列表中。

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

前提是每种产品和语言最多只能有一个描述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2010-09-06
    • 1970-01-01
    相关资源
    最近更新 更多