2012-04-10 11 views
1

私は正しい結果を得られる次のクエリを持っています。しかし、それは非常に遅いです。 遅くするとMySQL "Distinct" join super slow

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

部分です。どの国からどのくらい多くの注文があるのか​​という質問が表示されます。
人は複数のアドレスを持つことができますが、この場合は1つしか必要ありません。
それ以外の場合は、注文を何回かカウントします。多分、これを達成するより良い方法がありますか?その人や何かに明確なつながりがありますか?

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

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

これは、完全なクエリですか?もちろん、各注文に固有のアドレスを1つだけ取得することは可能ですか? –

+0

補助クエリからグループを削除すると、これが役に立ちます –

+0

@Rory customer_orderは請求先住所を追跡します。しかし、それはしばしば秩序が由来する国ではない。私たちの顧客のほとんどはヨーロッパにあり、国ごとに注文しています。しかし、請求センターはしばしばどこかに集約されます。 – Remy

答えて

0

私はより速い解決策を見つけました。トリックは、サブクエリに参加している:CUSTOMER_ORDER表を配信や請求先住所を追跡しません

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サブクエリだけを保持すると、それは行いません。 –