【问题标题】:MySQL query with grouping, a procedure and "HAVING"具有分组、过程和“HAVING”的 MySQL 查询
【发布时间】:2012-12-08 22:41:02
【问题描述】:

我目前有这个查询:

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

【问题讨论】:

    标签: mysql sql group-by having haversine


    【解决方案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
    

    【讨论】:

    • 这似乎是目前最有效的方式,直到我们可以使用更有效的方式使用外部系统(例如 Sphinx、下面或 Solr)
    【解决方案2】:

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

    您是否已经在该项目中使用 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

    【讨论】:

    • 谢谢马科斯!我知道 Sphinx——事实上,我一直想走这条路,以实现更快、更高效的处理。遗憾的是,由于时间限制,暂时无法完成。但我注意到了这一点,我会回复你的:D
    猜你喜欢
    • 2017-02-08
    • 2016-12-21
    • 2021-12-02
    • 2013-03-13
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多