【问题标题】:Select row by minimal distance按最小距离选择行
【发布时间】:2013-11-28 02:23:26
【问题描述】:

我想选择离给定经度、纬度值最近的地方 所以我创建了这个查询

SELECT *
FROM   "Places"
WHERE  2 * atan2(
sqrt(
sin((radians(41.647780 - latitude))/2)*sin((radians(41.647780 - latitude))/2) + 
sin((radians(25.295330 - longitude))/2)*sin((radians(25.295330 - longitude))/2) * 
cos(radians(latitude)) * cos(radians(41.647780))
),
sqrt(1 - 
sin((radians(41.647780 - latitude))/2)*sin((radians(41.647780 - latitude))/2) + 
sin((radians(25.295330 - longitude))/2)*sin((radians(25.295330 - longitude))/2) * 
cos(radians(latitude)) * cos(radians(41.647780))
)) * 6371 IS MINIMAL
LIMIT 1

主要思想是这个公式返回所有点和我的硬编码之间的距离我在选择查询中尝试过这个公式并且它正在工作。

我想获得“最小”的距离,我需要像“IS MINIMAL”这样的东西。我知道以上是错误的(可能非常错误和愚蠢),但我在这些领域是新手。我想我只需要添加或更改一两个单词就可以了,但我不知道正确的单词。

【问题讨论】:

    标签: sql postgresql sql-order-by distance knn


    【解决方案1】:

    你要找的是ORDER BY .. LIMIT 1:

    SELECT *
    FROM   "Places"
    ORDER  BY atan2(
       sqrt(
       sin((radians(41.647780 - latitude))/2)*sin((radians(41.647780 - latitude))/2) + 
       sin((radians(25.295330 - longitude))/2)*sin((radians(25.295330 - longitude))/2) * 
       cos(radians(latitude)) * cos(radians(41.647780))
       ),
       sqrt(1 - 
       sin((radians(41.647780 - latitude))/2)*sin((radians(41.647780 - latitude))/2) + 
       sin((radians(25.295330 - longitude))/2)*sin((radians(25.295330 - longitude))/2) * 
       cos(radians(latitude)) * cos(radians(41.647780))
       ))
    LIMIT  1;
    

    您可能对PostGis 或此相关问题感兴趣:
    How can I get results from a JPA entity ordered by distance?

    【讨论】:

    • 最后,我用order by做了,但这不是有点慢,我们选择所有地方然后订购它们,但没有任何好的方法。是的,我知道 PostGis,我认为它很酷,但是对于这个大学项目,我使用的是 heroku postgres dev(基本免费版本)并且不包含 PostGis。感谢您的回答。
    猜你喜欢
    • 2020-12-18
    • 2013-02-09
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 2013-01-28
    • 1970-01-01
    相关资源
    最近更新 更多