我有两张桌子。以下是将在查询中使用的一些字段。
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子句时,它向我展示了销售量最大的产品,但是我需要它在特定时期内进行销售时我无法弄清楚如何去做。
答案 0 :(得分:1)
查询看起来正确,假设code
是tgc_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子句中。