2014-05-08 1 views
1

두 테이블이 있습니다. 다음은 쿼리에 사용될 일부 필드입니다. 내가 원하는 무엇MySQL 쿼리는 일정 기간 내에 가장 많이 팔린 제품을 찾습니다.

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 절을 무시하면 가장 많이 팔린 제품을 보여 주지만 특정 기간에 판매가 이루어졌고이를 수행하는 방법을 알 수 없기 때문에 필요할 때가 있습니다.

+1

'sales_date_time'의 유형은 무엇입니까? 몇 가지 샘플 값으로 질문을 편집하십시오. –

+0

집계 SUM()을 제거하면 항목과 관련하여 올바른 수량 값을 얻나요? – nbpeth

답변

1

codetgc_sales 테이블의 고유 한 (또는 기본) 키이고 sales_code이 해당 열에 대한 외래 키 참조라고 가정하면 쿼리가 올바르게 보입니다.

DATE() 기능의 사용이 조금 이상하게 보입니다.

sales_date_time 컬럼 DATE, DATETIME 또는 TIMESTAMP의 데이터 형식을 가지고있는 경우, 다음 DATE() 기능이 필요하지 않고, 그 술어를 만족 주사 범위의 인덱스를 사용하는 MySQL의 능력이 불가능하기 때문에 바람직하지이다.

문자가 sales_date_time이고 문자를 DATE로 변환하려는 경우 STR_TO_DATE() 기능을 사용하십시오. 하지만 실제로는 sales_date_time을 문자열로 저장하고 싶지는 않습니다. 가 아닌 표준 형식의 문자 열 (예를 들어, 만약

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

: 그 날짜 시간 열이 있다면

, 당신은 이런 식으로 뭔가를 할 것 'MM/DD/YYYY의 hh는 : 마일 : SS를' . 당신이 DATETIME 같은 MySQL의 데이터 유형 중 하나를 사용하려면)

,

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' 

(하지만 당신은 정말 문자열에서 날짜 시간 값을 저장하지 않습니다), 당신은 뭔가를 할 수

유닉스 스타일의 타임 스탬프 인 "시대의 시작부터 초"를 저장하면 네이티브 컬럼 값과의 비교를 원할 것이다. 당신이 정말로 값이 저장된 경우 변환을 수행하는 데 사용되는 동일한 라이브러리를 사용하는 것을 선호 거라고하지만 ...

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 
+0

안녕하세요, 스펜서, 감사합니다.일단 당신이 말했지 만, 쿼리는 기본 및 외래 키 제약 조건을 가정 할 때 괜찮아 보입니다. 몇 가지 테스트를 수행하고 테이블에 몇 가지 잘못된 데이터가 있다는 것을 알았습니다. 나는 모든 레코드를 제거하고 모두 잘 작동합니다. 저에게 올바른 방향을 알려 주셔서 감사합니다. – James

0

귀하의 그룹에 의해 의심스러운 것 같습니다. select 절에없는 product_code 열을 포함합니다.

+0

Tarik, group by product_name을 사용하더라도 여전히 동일한 결과 집합을 보여줍니다. 특정 product_code의 product_name은 동일합니다. 혼란을 드려 죄송합니다. – James

관련 문제