我目前有这个查询:
SELECT *, GEODIST(41.3919671, 2.1757278, latitude, longitude) distance
FROM offers_all
WHERE id_family=1761 AND GEODIST(41.3919671, 2.1757278, latitude, longitude) <= 40
GROUP BY id_prod ORDER BY pricepromo ASC
如您所见,它使用称为 GEODIST(Haversine 公式,以 KM 为单位返回坐标之间的距离)的 MySQL 过程,并将结果按id_prod
.
该表可能包含每个产品的多个报价 ( id_prod
)。目标是检索报价列表,没有重复的产品,因此返回该报价的最佳(最便宜、最接近)案例。
前面的查询似乎做得很好,但为了进一步优化,我想使用HAVING
(不必为每行运行两次 Haversine)。这是我的第一个想法:
SELECT *, MIN(GEODIST(41.3919671, 2.1757278, latitude, longitude)) distance
FROM offers_all
WHERE id_family=1761
GROUP BY id_prod
HAVING distance <= 40
ORDER BY pricepromo ASC
遗憾的是,此查询不会返回与以前相同的结果。
不使用MIN()
,结果不正确(仅返回一行)。使用MIN()
(如在最后一个查询中),行信息不正确(即没有返回预期的行,导致结果在列表中显示错误的商店名称和价格)。
欢迎任何有关此目标(和其他建议)的最佳查询的提示或答案:D