带分组、过程和“HAVING”的MySQL查询

带分组、过程和“HAVING”的MySQL查询,mysql,sql,group-by,having,haversine,Mysql,Sql,Group By,Having,Haversine,我目前有以下问题: 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 遗憾的是,此查询返回的结果与前面的不同 如果不使用

我目前有以下问题:

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
遗憾的是,此查询返回的结果与前面的不同

如果不使用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

我很确定有些人会建议使用相同的表别名连接方法,因此我将尝试使用其他建议:

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

更多关于斯芬克斯论坛主题的信息:

此外,您可能更愿意采用Tiles方法来实现性能:


谢谢你,马科斯!我知道狮身人面像——事实上,我一直想走这条路,以实现更快、更高效的处理。遗憾的是,由于时间限制,目前无法完成这项工作。但我注意到了这一点,我会回复你:这似乎是目前最有效的方法,直到我们可以使用一种更有效的方法使用外部系统,如Sphinx、below或Solr
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