3

我有一张表service_contacts ,可以包含listidslists和表中contactids的内容contacts。 有和表contact_list_relationship之间的关系。contactslists

我正在尝试提取可能在 a contactidinservice_contacts或 a 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

1 回答 1

2

假设您要加入的字段已编入索引/或最好使用FOREIGN KEY约束定义(强制索引),您应该没问题。

然而 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在每次引用表后声明 'force key for join。

于 2012-10-09T14:35:47.273 回答