2012-04-10 3 views
1

다음과 같은 쿼리를 통해 올바른 결과를 얻을 수 있습니다. 그러나 그것은 천천히 슈퍼입니다. 느리게 만드는 것은MySQL의 "Distinct"Join super slow

AND a.id IN (SELECT id FROM st_address GROUP BY element_id) 

부분입니다. 이 쿼리에는 얼마나 많은 주문을 얻은 국가가 표시되어야합니다.
한 사람이 여러 주소를 가질 수 있지만이 경우에만 하나만 필요합니다.
그렇지 않으면 주문을 여러 번 계산합니다. 어쩌면 이것을 달성하는 더 좋은 방법이 있을까요? 그 사람이나 다른 사람과 뚜렷한 조화?

SELECT cou.title_en, COUNT(co.id), SUM(co.price) AS amount 
FROM customer_order co 
JOIN st_person p ON (co.person_id = p.id) 
JOIN st_address a ON (co.person_id = a.element_id AND a.element_type_id = 1) 
JOIN st_country cou ON (a.country_id = cou.id) 
WHERE order_status_id != 7 AND a.id IN (SELECT id FROM st_address GROUP BY element_id) 
GROUP BY cou.id 
+0

가 customer_order 테이블이 배달 또는 청구 주소를 추적하지 않습니다? 물론 각 주문과 관련된 주소를 하나만 얻을 수 있습니까? –

+0

하위 쿼리에서 그룹을 삭제하면 도움이 될 수 있습니다. –

+0

@Rory customer_order가 청구서 수신 주소를 추적합니다. 그러나 그것은 종종 명령이 오는 나라에서는 그렇지 않습니다. 고객의 대부분은 유럽에 있으며 국가 별 주문이 있습니다. 그러나 결제 센터는 종종 중앙 어딘가에 있습니다. – Remy

답변

0

더 빠른 해결책을 찾았습니다. 트릭은이 하위 쿼리에 가입되어

JOIN (SELECT element_id, country_id, id FROM st_address WHERE element_type_id = 1 GROUP BY 

이 전체 쿼리입니다 :

SELECT cou.title_en, COUNT(o.id), SUM(o.price) AS amount 
FROM customer_order o 
JOIN (SELECT element_id, country_id, id FROM st_address WHERE element_type_id = 1 GROUP BY element_id) AS a ON (o.person_id = a.element_id) 
JOIN st_country cou ON (a.country_id = cou.id) 
WHERE o.order_status_id != 7 
GROUP BY cou.id 
1

IN을 EXISTS로 바꾸려고 했습니까?

EXISTS 부분은 조건과 일치하는 첫 번째 행이 발견되는 즉시 하위 쿼리를 중지해야합니다. 나는 이것이 실제로 일어나고 있는지에 대해 의견이 충돌하는 것을 읽었습니다. 그래서 당신이 거기에 한계 1을 던져 어떤 이득을 얻는지를 볼 수 있습니다.

+0

그것은 실제로 훨씬 빠르지 만 모든 주소를 여전히 계산합니다. – Remy

+0

아니요, 주소 테이블에 조인을 제거하고이 Exists 하위 쿼리 만 유지하면 안됩니다. –