【问题标题】:MySQL query to find most sold products within a time periodMySQL查询以查找一段时间内最畅销的产品
【发布时间】:2014-06-26 11:24:32
【问题描述】:

我有两张桌子。以下是一些将在查询中使用的字段。

tgc_sales (code,sale_date_time, order_status)

tgc_sales_items (sales_code, quantity, product_name, product_code)

我想要的是在特定时间段(比如一周、一个月等)内获得销量最高的产品。

到目前为止我尝试了什么:

SELECT SUM(tsi.quantity) AS quantity, tsi.product_name AS product_name
FROM tgc_sales_items tsi 
JOIN tgc_sales ts ON ts.code = tsi.sales_code
WHERE DATE(ts.sale_date_time)>='2014-05-01'
    AND ts.order_status='Completed' 
GROUP BY tsi.product_code
ORDER BY quantity DESC LIMIT 10

显然,查询是错误的,它给了我意想不到的结果。当我忽略 JOIN 和 WHERE 子句时,它会向我显示最畅销的产品,但我需要它用于特定时期的销售,我不知道该怎么做。

【问题讨论】:

  • sales_date_time的类型是什么?请使用一些示例值编辑问题。
  • 如果您删除聚合 SUM(),您是否会获得与项目相关的正确数量值?

标签: mysql sql select join group-by


【解决方案1】:

查询看起来正确,假设codetgc_sales 表上的唯一(或主)键,sales_code 是对该列的外键引用。

DATE() 函数的使用似乎有点奇怪。

如果 sales_date_time 列的数据类型为 DATE、DATETIME 或 TIMESTAMP,则不需要 DATE() 函数,因为它禁用了 MySQL 使用索引范围扫描来满足谓词的能力.

如果sales_date_time 是字符,并且您的意图是将字符转换为日期,您将使用STR_TO_DATE() 函数。但是您并不想将sales_date_time 存储为字符串。

如果这是一个 DATETIME 列,你会做这样的事情:

WHERE ts.sale_date_time >= '2014-05-01'
  AND ts.sale_date_time <  '2014-06-01'

如果它是非规范格式的字符列(例如 'mm/dd/yyyy hh:mi:ss'),那么您可以执行以下操作:

WHERE STR_TO_DATE(ts.sale_date_time,'%m/%d/%Y %h:%i:%s') >= '2014-05-01'
  AND STR_TO_DATE(ts.sale_date_time,'%m/%d/%Y %h:%i:%s') <  '2014-06-01'

(但您并不想将日期时间值存储在字符串中;您想使用 MySQL 数据类型之一,例如 DATETIME。)

如果您要存储 unix 样式的时间戳“自一个时代开始以来的秒数”,那么您需要与本机列值进行比较。你可以这样做:

WHERE ts.sale_date_time >= UNIX_TIMESTAMP('2014-05-01')
  AND ts.sale_date_time <  UNIX_TIMESTAMP('2014-06-01')

...虽然您确实更喜欢在存储值时使用用于进行转换的同一个库,并且更像这样进行查询:

WHERE ts.sale_date_time >= 1398902400
  AND ts.sale_date_time <  1401580800

【讨论】:

  • 嗨,斯宾塞,谢谢。一旦你说,假设主键和外键约束,查询看起来没问题,我做了很少的测试,发现表中有一些坏数据,这意味着我有重复的地方应该是唯一的。我删除了所有记录,一切正常。感谢您为我指明正确的方向。
【解决方案2】:

您的群组似乎可疑。它包括不在 select 子句中的 product_code 列。

【讨论】:

  • Tarik,即使我使用 group by product_name,它仍然显示相同的结果集。特定产品代码的产品名称是相同的。很抱歉造成混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
相关资源
最近更新 更多