3

テーブルとテーブルからservice_contacts 含むことができるテーブルが1つあります。 とテーブルの間に関係があります。listidslistscontactidscontactscontact_list_relationshipcontactslists

、または(各リストに含まれているcontactid)にある可能性のあるすべての連絡先をプルしようとしています。service_contactslistidcontactids

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を実行できます。

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;

結果は、ステートメントで使用されているインデックスを通知します。indexname結果が期待どおりでない場合は、テーブルへの各参照の後に結合に'forceキーを指定することにより、Mysqlにインデックスの使用を強制できます。

于 2012-10-09T14:35:47.273 に答える