2012-04-26 57 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行,它的性能是沒有效率的第二個查詢獲取所有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的會員。 而我不確定問題是什麼。

由於許多表和WHERE子句,我相信我在連接方面做了錯誤,但我只有在兩個表之間進行左/右連接的經驗。

任何人都可以找出問題嗎?

回答

1

每個JOIN操作應該有一個相應的ON語句來告訴SQL如何合併新表中的記錄。看起來你正在做WHERE語句中的一些邏輯,這可能會導致問題。

此外,至於獲取沒有local_store_id的成員,可能是因爲您正在對商店進行內部連接,所以您的結果集只有根據連接邏輯在商店中具有相應行的成員。左外連接可能會給你你想要的。

+0

將'LEFT JOIN'改爲'LEFT OUTER JOIN'給了我相同的結果。您似乎不可能將WHERE子句移到連接處 - 或者至少,我不知道應該如何完成這個任務。 – Repox 2012-04-26 11:59:41

+0

那麼,最終讓WHERE子句移動到連接,而是給了我需要的結果。謝謝。 – Repox 2012-04-26 12:59:45