2017-05-03 31 views
0

我有兩個大表,其中兩個表都有一個venue_id。它不是外鍵,因爲它們是兩個獨立的值。它們分別是:通過MySQL使用WHERE在兩個表中進行大表查詢

table: activity_retail 
columns: activity_id, venue_id, created_at 
indexes: activity_id (PRIMARY), (activity_id, venue_id) INDEX 


table: activity 
columns: activity_id, item_id, venue_id, created_at 
indexes: activity_id (PRIMARY), (created_at) INDEX 

我想這樣做在兩個人的查詢,到venue_id每個表等於X所有活動。所以,我會做:

SELECT * from activity 
    LEFT JOIN activity_retail on activity_retail.activity_id = activity.activity_id 
    WHERE activity_retail.venue_id = X or activity.venue_id = X 
ORDER BY activity_retail.created_at desc LIMIT 0, 25 

我可能還需要爲分頁做這個查詢:

​​

的情況是activity_idactivity_retail可能不存在,這是一個可選字段,這樣我就可以」 t做內連接,必須是左連接。

這裏是EXPLAIN

1 PRIMARY activity index ix_ivi_created created_at 8 NULL 25 Using where 
1 PRIMARY activity_retail eq_ref PRIMARY PRIMARY 4 activity.activity_id 1 

雖然這是小的查詢(根據EXPLAIN),它需要很長的時間來執行,並在EXTRAS區域不使用任何。

任何關於如何使這個工作正常的建議 - 基本上聲明跨兩個表的WHERE條件? AND工作得很好,但我們在這裏需要OR

+0

你可以提供一個描述在桌子上,所以我們可以看到你的索引? – ghenghy

+0

另外,你說,但你的「其中venue_id每個表等於X」查詢得到的地方venue_id等於任何一個表中的X既不是 – ghenghy

+0

某些樣本數據和期望的結果也會有幫助 – ghenghy

回答

0

你似乎很接近你的左連接。但是,只要將條件移動到零售表的WHERE子句中,它就會強制爲內部聯接。請嘗試以下...

SELECT 
     A.*, 
     AR.* 
    from 
     activity A 
     LEFT JOIN activity_retail AR 
      on A.activity_id = AR.activity_id 
      AND AR.Venue_ID = X 
    WHERE 
      A.Venue_ID = X 
     OR NOT AR.Activity_ID IS NULL 
    ORDER BY 
     AR.created_at desc 
    LIMIT 
     0, 25 

注意我將「AR.Venue_ID = X」移入了JOIN子句。這樣它只會匹配IF次表具有「X」的情況,否則它將始終爲空。

現在where子句測試Venue_ID的活動表(總是測試記錄),或者AR_ActivityID不是NULL(意思是它找到了具有適當場地的表中的記錄,因此是否存在被拉入結果集。

希望這樣做,你在找什麼。

+0

不幸的是 - 這不起作用,或正確使用任何索引,這是一個全表掃描。 – gregavola