郵便番号の表があります。
id INT, postcode VARCHAR(8)
また、2つの異なる郵便番号間の1方向の距離のみを格納する、これらの郵便番号間の距離のテーブル。したがって、郵便番号ID2から郵便番号ID5までの距離は、as2, 5, 78.2
またはasのいずれかでのみ保存され5, 2, 78.2
、両方では保存されません。
from INT, to INT, dist DECIMAL
距離の主キーは(from、to)であり、そのテーブルの各列にもインデックスがあります。
次のようなクエリがあります。
SELECT *
FROM listings, postcode_distances,
postcodes postcode_listings, postcodes postcode_searchterm
WHERE listing.`status` = 3
AND listings.category = 8
AND postcode_listings.id = listings.postcode_id
AND (
(postcode_distances.to = postcode_listings.id AND
postcode_distances.from = postcode_searchterm.id AND
postcode_distances.dist < 30)
OR
(postcode_distances.from = postcode_listings.id AND
postcode_distances.to = postcode_searchterm.id AND
postcode_distances.dist < 30)
)
AND postcode_searchterm.postcode = 'AB11'
GROUP BY id_listings
ORDER BY postcode_distances.dist ASC;
クエリの実行は遅く(おそらく予想どおり)、副作用としてデータベースがロックされます。
クエリを説明すると、postcode_distances結合の次の行が表示されます。
1 | SIMPLE | postcode_distances | ALL | PRIMARY,dist,to,from | 695332 | Using where; Using join buffer
1つのクエリで2つの結合(検索される郵便番号がfrom
またはto
列のいずれかである場合)を実現する方法はありますか?
UNIONを使用して、クエリを2回実行することもできますが、postcode_distance OR条件の各半分を各クエリに入れますが、これを行う別のより簡単な方法を見逃していないかどうかを確認したかったのでしょうか。