MySQL 查询指定英里半径内的行
在处理涉及经纬度坐标的数据库查询时,高效的查询变得至关重要检索落在特定地理半径内的行。为了在 25 英里半径内获得精确结果,以下查询利用数学公式:
<code class="sql">SELECT *,(((acos(sin(($lat*pi()/180)) * sin((`latitude`*pi()/180))+cos(($lat*pi()/180)) * cos((`latitude`*pi()/180)) * cos((($lon - `longitude`)*pi()/180))))*180/pi())*60*1.1515) AS `distance` FROM `geo_locations` HAVING `distance` <= 25 ORDER BY `distance` ASC</code>
此查询使用三角公式来计算每行坐标与指定中心纬度 ($lat ) 和经度 ($lon)。但是,当扩展到更大的半径时,它有时可能会产生不准确的结果。
改进的查询
要获得更精确的结果,请考虑使用以下查询:
<code class="sql">SELECT `id`, ( 6371 * acos( cos( radians( :lat ) ) * cos( radians( `lat` ) ) * cos( radians( `long` ) - radians( :long ) ) + sin(radians(:lat)) * sin(radians(`lat`)) ) ) `distance` FROM `location` HAVING `distance` < :distance ORDER BY `distance` LIMIT 25</code>
在此查询中,:lat 和 :long 表示用户传递的中心纬度和经度,而 location 是包含目标行的表。 :distance 是所需的半径(以英里为单位)。将 3959(从地球中心到其表面的距离,以英里为单位)替换为 6371(转换为公里),就可以使用公里来代替。
以上是如何使用MySQL查询高效检索指定英里半径内的行?的详细内容。更多信息请关注PHP中文网其他相关文章!