› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
gangsta
V2EX  ›  MySQL

一条关于用 MySQL 查找某个范围(比如 5 公里内)用户 timeline 更新的 sql

  •  2
     
  •   gangsta · Aug 6, 2015 · 3731 views
    This topic created in 4076 days ago, the information mentioned may be changed or developed.

    这应该算是LBS最常见的一个功能了吧:
    用户查看timeline时首先取得自己当前GEO(经纬度坐标),然后与数据库里的经纬度经行计算、比较后排序.
    其实就是这个问题:
    http://stackoverflow.com/questions/1006654/fastest-way-to-find-distance-between-two-lat-long-points

    google了一下找到挺多的,请教下大家有没有跑在线上的,正确稳定的sql供参考下呢?

    Supplement 1  ·  Aug 14, 2015
    DELIMITER $$
    DROP FUNCTION IF EXISTS `func_distance_` $$
    CREATE FUNCTION `func_distance` (lat1 decimal(10,6), lng1 decimal(10,6), lat2 decimal(10,6), lng2 decimal(10,6))
    RETURNS decimal(10,3) DETERMINISTIC
    BEGIN
        RETURN 6378.138 * 2 * ASIN(SQRT(
            POWER(SIN((lat1 - abs(lat2)) * pi()/180 / 2),
            2) + COS(lat1 * pi()/180 ) * COS(abs(lat2) *
            pi()/180) * POWER(SIN((lng1 - lng2) *
            pi()/180 / 2), 2) ));
    END
    

    最后用的是这个,好像误差有点大?

    3 replies  •  2015-08-06 15:50:00 +08:00
    gangsta
        1
    gangsta  
    OP
       Aug 6, 2015
    刚才Google的时候才发现好多不知道的mysql内置函数啊:MBRContains() RADIANS() ...
    zado
        2
    zado  
       Aug 6, 2015
    这是我做的在线上跑的: http://www.zxapi.com/last.html 我是用键值数据库来存储和检索的。先用类似 GeoHash 的编码方式对坐标编码,检索的时候按需要的精度选取合适的前缀去列举,当然因为 GeoHash 算法的原因,范围要预估大一点,然后计算每个点的距离,然后排序选取距离最小的那一部分。
    zhicheng
        3
    zhicheng  
       Aug 6, 2015
    新的 MySQL 和 MariaDB 已经有了 Geo 的功能了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2446 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:32 · PVG 22:32 · LAX 07:32 · JFK 10:32
    ♥ Do have faith in what you're doing.