2

我目前有这个查询:

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

4

2 回答 2

1

您可以使用派生表执行此操作:

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
于 2012-12-08T23:03:53.237 回答
1

我很确定有些人会建议使用相同的表别名加入方法,所以我会采用“其他建议”的尝试:

您是否已经在该项目中使用 Sphinx,可能用于全文产品搜索?Sphinx 可以为您提供对地理距离的内置支持,只是我过去在该主题上获得的一些随机 URL:

http://www.fliquidstudios.com/2011/06/17/an-introduction-to-distance-based-searching-in-sphinx/

http://www.sanisoft.com/blog/2011/05/02/geo-distance-search-in-sphinx/

更多关于 Sphinx 论坛本身的主题:

http://sphinxsearch.com/forum/view.html?id=7276

此外,也许您更愿意采用“Tiles”方法来提高性能:

http://sphinxsearch.com/forum/view.html?id=7823

http://sphinxsearch.com/forum/view.html?id=2482

http://sphinxsearch.com/forum/view.html?id=5688

于 2012-12-08T23:10:39.707 回答