2012-04-26 34 views
0

によって誘致this article私はデータベースからメンバーリストのエクスポート機能を最適化しようとしました。複数のテーブルの結合?

元のクエリは次のようになります。

-- First query 
SELECT 
    * 
FROM 
    members_customer_id_0000000169 
WHERE 
    deleted = '0000-00-00 00:00:00' 

-- Second query run for every result from first query 
SELECT 
    stores.external_store_id AS local_store_id 
FROM 
    regions, 
    stores, 
    stores_reference_members_customer_id_0000000169 
WHERE 
    regions.customer_id = 169 
AND 
    stores.region_id = regions.id 
AND 
    stores_reference_members_customer_id_0000000169.member_id =' . $result['id'] . ' 
AND 
    stores_reference_members_customer_id_0000000169.store_id = stores.id 

を最初のクエリは、180Kの行を返し、その性能は、2番目のクエリはすべて180K回のフェッチ効率的ではありません。

私の代わりにこれをやってみました:

SELECT 
    members_customer_id_0000000169.*, 
    stores.external_store_id AS local_store_id 
FROM 
    members_customer_id_0000000169 
LEFT JOIN 
    stores_reference_members_customer_id_0000000169 
ON 
    stores_reference_members_customer_id_0000000169.member_id = members_customer_id_0000000169.id 
JOIN 
    regions 
JOIN 
    stores 
WHERE 
    members_customer_id_0000000169.deleted = '0000-00-00 00:00:00' 
AND 
    regions.customer_id = 169 
AND 
    stores.region_id = regions.id 
AND 
    stores_reference_members_customer_id_0000000169.store_id = stores.id 

結果は唯一の140K行です。その理由はおそらく私が意図した通りにlocal_store_idのないメンバーを取得しないということです。 そして私は問題が何であるか確信しています。

私は私があるため、多くのテーブルと句の加入が、私は唯一のLEFT/RIGHT 2つのテーブル間の結合を行うと経験を持っていると間違って何かをやっていることを確信しています。

誰でも問題を特定できますか?

答えて

1

各操作は、新しいテーブルからレコードをマージする方法SQLを伝えるためにON、対応するステートメントを持っている必要があり参加します。問題を引き起こしている可能性のあるWHEREステートメントで、そのロジックの一部を実行しているようです。

また、local_store_idを持たないメンバーを取得する場合は、ストアで内部結合を行っているため、結果セットには、結合ロジックに基づいてストア内の対応する行を持つメンバーのみが存在する可能性があります。左外部結合はあなたが探しているものを与えるかもしれません。

+0

「LEFT JOIN」を「LEFT OUTER JOIN」に変更すると、同じ結果が得られます。 WHERE句を結合に移動することは不可能です。少なくとも、これをどうすればよいのか分かりません。 – Repox

+0

最後に、WHERE句を継承に移動して、代わりに必要な結果を得ました。ありがとうございました。 – Repox

関連する問題