我有一张邮政编码表:
id INT, postcode VARCHAR(8)
以及这些邮政编码之间的距离表,该表仅存储两个不同邮政编码之间的一个方向的距离,因此从邮政编码 ID 2 到邮政编码 ID 5,距离仅存储为2, 5, 78.2
或存储为,5, 2, 78.2
但不能同时存储。
from INT, to INT, dist DECIMAL
距离的主键是(从,到),我在该表的每一列上也有一个索引。
我有一个看起来像这样的查询:
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
有什么方法可以在单个查询中实现两个连接(搜索的邮政编码是列from
或列)?to
我可以使用 UNION 并只运行两次查询,但将 postcode_distance OR 条件的每一半放在每个查询中,但我想检查我是否错过了另一种更简单的方法?