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

标签 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

如您所见,它使用名为 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/

相关文章:

php - 为什么网站在线时我的后台不工作?

Javascript/PHP : set textarea value

mysql - 选择哪个哈希函数来索引 mysql 上的 uuid 字符串? md5,crc64 或 fnv

MySQL 三态属性

php - 如何在mysql中存储用户的头像

sql - Oracle PL/SQL 的单元测试框架?

mysql - 使用 SQL join 仅选择最新版本的数据

mysql - 同一个语句中的分组依据和排序依据(每月)

mysql - 如何对我的 mysql 结果进行分组

c# - 在 GroupBy() 之后按 LINQ 中的数组索引平均元素