MySQL查询在一定范围内拉经度

Posted

技术标签:

【中文标题】MySQL查询在一定范围内拉经度【英文标题】:MySQL query to pull longitude within certain range 【发布时间】:2015-08-23 19:54:07 【问题描述】:

我有一个使用简单 WHERE logitude != '0' 的查询,但我认为仅提取已成功进行地理编码的记录就足够了。

我无法控制质量或地址是否成功进行地理编码,因为表格是只读的。我只能控制我的查询。

经度通常最多保留 6 位小数:-81.729345

纬度和经度列的数据类型为十进制,长度为9,小数为6。

我想我需要确保只选择一定经度范围内的记录?

我试过这个:Longitude BETWEEN '-89.69%' AND '-72.07%' 有和没有 %

但它会返回所有记录,所以我知道它是错误的,因为某些记录的地理编码不正确(例如:14.359164)。

如何仅在该范围内选择并允许小数位数?

这是纬度/经度列的 sn-p:

26.219295   -81.722585
26.280398   -81.629169
26.134763   -81.795894
26.1255 -81.788166
26.403096   -81.787194
26.1219 -81.793919
26.247832   -81.82119
26.22877    -81.795777
26.25278    -81.78444
26.319679   -81.731197
26.02094    -81.685416
26.364607   -81.817356
25.9351 -81.723069
26.392275   -81.818925
40.903837   14.359164

【问题讨论】:

您能否运行show create table xxxx 并发布几行数据以便窥视者可视化? @Drew,用 lat/long 的示例列更新了问题...我认为这就足够了。该表很大,并且记录本身只是标准的房地产数据,不确定在有问题的两列之外它会如何提供帮助。告诉我。 show create table xxx 产生了什么 一张大桌子……这与我的问题有什么关系? @Drew 想知道您的 longitude 列的数据类型。这很重要。 【参考方案1】:

latitudelongitude 列通常具有 FLOATDOUBLE 数据类型。他们很少有DECIMAL(10,4) 数据类型,有时面对所有的理由和逻辑,他们有VARCHAR(15) 或一些这样的数据类型。

如果您是FLOATDOUBLE,则您的比较是通过算术而不是文本模式匹配完成的。所以你想要这种WHERE 子句。

WHERE Longitude BETWEEN -89.69 AND -72.07   

这将捕获 -89.69、-72.07 以及介于两者之间的所有值。

这也适用于DECIMAL 数据类型。如果您有 varchar 经度数据,最好的办法是将其更改为 FLOAT。做不到这一点,你想要

 WHERE  CAST(longitude AS DECIMAL(10,4))  BETWEEN -89.69 AND -72.07

但这会有糟糕的性能。

% 通配符仅适用于字符数据类型,并且仅适用于 LIKE 比较。

【讨论】:

完美,效果很好,解释也很好......非常感谢@ollie

以上是关于MySQL查询在一定范围内拉经度的主要内容,如果未能解决你的问题,请参考以下文章

MySQL选择地理位置范围内的行

sql语句查询经纬度范围

在节点 js mysql 查询中传递经度和纬度和距离作为参数

MySQL:多个纬度和经度的附近位置

我有带有纬度和经度等的表名,现在我想在 mysql 查询中以半径获取数据?

MYSQL查询对GPS坐标进行排序