1

正しい結果が得られる次のクエリがあります。しかし、それは超遅いです。遅くするのは

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 
4

2 に答える 2

1

INをEXISTSに置き換えようとしましたか?

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

EXISTS部分は、条件に一致する最初の行が見つかるとすぐにサブクエリを停止する必要があります。これが実際に起こっているかどうかについての矛盾するコメントを読んだので、そこに制限1を投げて、利益が得られるかどうかを確認することができます。

于 2012-04-10T13:18:46.910 に答える
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 
于 2012-04-11T08:27:48.213 に答える