我有一个表service_contacts
,可以包含listids
表中的lists
和来自contactids
表的contacts
。 contact_list_relationship
具有contacts
和lists
表之间的关系。
我正在尝试提取contactid
service_contacts
或listid
(每个列表中包含contactids
)的所有联系人。< / p>
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
这会运行,并提取预期结果。到目前为止......我只是想知道是否有更好的方法。
答案 0 :(得分: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使用索引,并在每次引用表后声明'force key for join indexname
。