2012-04-10 63 views
1

我有以下查詢,它給了我正確的結果。但它超級慢。 是什麼讓它慢MySQL「獨特」加入超級慢

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表不能跟蹤交貨或賬單地址?當然,有可能只獲得每個訂單特定的單一地址? – 2012-04-10 12:59:06

+0

從子查詢中刪除組可能會有所幫助 – 2012-04-10 13:09:49

+0

@Rory customer_order確實跟蹤帳單地址。但這通常不在訂單來自的國家。我們的大部分客戶都在歐洲和每個國家的訂單。但結算中心通常集中在某個地方。 – Remy 2012-04-10 14:03:14

回答

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

您是否嘗試用EXISTS替換IN?

AND EXISTS (SELECT 1 FROM st_address b WHERE a.id = b.id) 

只要找到匹配條件的第一行,EXISTS部分就應該停止子查詢。我已經閱讀了相互衝突的評論,看看是否真的發生了,所以你可以在這裏提出一個限制1來看看你是否獲得了任何收益。

+0

確實快得多,但它仍然計算每個地址。 – Remy 2012-04-11 08:26:30

+0

不,如果您將Join添加到地址表中,則不會發生 - 並且只保留此Exists子查詢。 – 2012-04-11 08:43:20