我目前有这个查询:
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
最佳答案
您可以使用派生表来执行此操作:
SELECT t.*, MIN(t.distance) AS distance
FROM (SELECT *, GEODIST(41.3919671, 2.1757278, latitude, longitude) AS distance
FROM offers_all
WHERE id_family=1761) AS t
WHERE t.distance <= 40
GROUP BY t.id_prod
ORDER BY t.pricepromo ASC
关于带分组、过程和 "HAVING"的MySQL查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13782675/