2012-10-08 44 views
3

我有一個表service_contacts,其中可以包含lists表中的listids表和contacts表中的contactids表。 contact_list_relationshipcontactslists表之間存在關係。這個MySQL多表連接好嗎?

我想拉這可能是一個contactid的所有聯繫人的service_contacts,或在listid(每個列表包含contactids)。

SELECT d.* FROM service_contacts a 
LEFT JOIN lists b 
    ON a.calllistid=b.listid 
LEFT JOIN contact_list_relationship c 
    ON c.listid=b.listid 
INNER JOIN contacts d 
    ON d.contactid=c.contactid OR d.contactid=a.contactid 
WHERE a.memberid=12345 

這個運行,並拉動預期的結果。到目前爲止......我只是想知道是否有更好的方法。

+4

不,只要您正確索引列或定義了FOREIGN KEY約束(這會強制索引創建)就可以了。 –

+0

感謝您的關注。 – Michael

+0

@MichaelBerkowski:應該是一個答案..?! –

回答

2

假設你加入的字段被索引/或最好用FOREIGN KEY約束(它強制索引)定義,你應該沒問題。

但是,即使MySQL可用,MySQL並不總是使用索引。要檢查指標正在使用,您可以運行在你的語句中的解釋即

EXPLAIN 
SELECT d.* FROM service_contacts a 
LEFT JOIN lists b 
    ON a.calllistid=b.listid 
LEFT JOIN contact_list_relationship c 
    ON c.listid=b.listid 
INNER JOIN contacts d 
    ON d.contactid=c.contactid OR d.contactid=a.contactid 
WHERE a.memberid=12345; 

的結果會告訴你這是在語句中使用的索引。如果結果不符合預期,您可以強制Mysql使用索引,並在每次引用表後指定「加入密鑰以加入indexname」。