MySQL查询在一段时间内查找大多数销售的产品

时间:2014-05-08 21:00:05

标签: mysql sql select join group-by

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

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子句时,它向我展示了销售量最大的产品,但是我需要它在特定时期内进行销售时我无法弄清楚如何去做。

2 个答案:

答案 0 :(得分:1)

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

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

如果sales_date_time列的数据类型为DATE,DATETIME或TIMESTAMP,则不需要DATE()函数,并且它不可取,因为它会禁用MySQL&# 39;能够使用索引范围扫描来满足谓词。

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

如果这是DATETIME列,您可以执行以下操作:

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

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

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'

(但你真的不想在字符串中存储日期时间值;你想使用像DATETIME这样的MySQL数据类型之一。)

如果您要存储自时代开始以来的unix样式时间戳&#34;秒,那么您希望对本机列值进行比较。你可以这样做:

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

答案 1 :(得分:0)

你的小组似乎很可疑。它包括product_code列,该列不在select子句中。