现在已知一个点的经纬度,要通过这个点搜索附近在送货距离之内的店铺。这些店铺的经纬度和送货距离保存在数据库中的,现在问的就是怎么写sql语句?

解决方案 »

  1.   

    比如现在有个点A($lat=1111.111,$lng=2222.222),数据库中有N个点类似B(包含lat,lng2个字段),以及送货距离sendmeter字段。
    请问怎么写sql语句,把AB2点距离在送货距离之内的店铺都找出来?
      

  2.   

    百度一下不就OK咯SELECT `id`,`map_x`,`map_y`, ROUND(6378.138*2*ASIN(SQRT(POW(SIN((22.546125*PI()/180-`map_y`*PI()/180)/2),2)+COS(22.546125*PI()/180)*COS(`map_y`*PI()/180)*POW(SIN((113.941072*PI()/180-`map_x`*PI()/180)/2),2)))*1000) AS juli
    FROM `shop`
    ORDER BY juli
      

  3.   

    直接根据距离也行
    $sql = "SELECT id, name, address, phone, image, (ACOS(SIN((lat * 3.1415) / 180 ) *SIN(($lat * 3.1415) / 180 ) +COS((lat * 3.1415) / 180 ) * COS(($lat * 3.1415) / 180 ) *COS((lng * 3.1415) / 180 - ($lng * 3.1415) / 180 ) ) * 6380 * 1000) as DISTINCE " 
    . " FROM dc_shop WHERE (ACOS(SIN((lat * 3.1415) / 180 ) *SIN(($lat * 3.1415) / 180 ) +COS((lat * 3.1415) / 180 ) * COS(($lat * 3.1415) / 180 ) *COS((lng * 3.1415) / 180 - ($lng * 3.1415) / 180 ) ) * 6380 * 1000) <= $distance "
    . " ORDER BY (ACOS(SIN((lat * 3.1415) / 180 ) *SIN(($lat * 3.1415) / 180 ) +COS((lat * 3.1415) / 180 ) * COS(($lat * 3.1415) / 180 ) *COS((lng * 3.1415) / 180 - ($lng * 3.1415) / 180 ) ) * 6380 * 1000) ASC LIMIT 0,$num
      

  4.   

    不要在查询里计算,这样效率会很差,先计算好条件需要的数据,再拼装查询SQL
      

  5.   

    对于
    ACOS(
      SIN((lat * 3.1415) / 180 ) * SIN(($lat * 3.1415) / 180 )  + 
      COS((lat * 3.1415) / 180 ) * COS(($lat * 3.1415) / 180 )  *
      COS((lng * 3.1415) / 180 - ($lng * 3.1415) / 180 )
    )  * 6380 * 1000
    中,套红的部分是可以事先计算好的,因为店铺的位置不会移动
    套绿的部分应在书写 sql 指令前计算好
    因此在查询时的计算量并不算大,只是多用了几个字段
      

  6.   

    $lat 和 $lng 不是传入的变量吗?就是指定的店铺的经纬度啰
    实际上是以店铺名从表中查到的呀
      

  7.   

    加了字段,又在sql里先WHERE了A点经纬度+-0.1之间,现在计算的速度很不错,对服务器压力也挺小的,算是解决比较理想了。再次感谢版主xuzuning和飞舞的锄头的热心指教。
      

  8.   

    $sql = "SELECT id, name, address, phone, image, (ACOS(SIN((lat * 3.1415) / 180 ) *SIN(($lat * 3.1415) / 180 ) +COS((lat * 3.1415) / 180 ) * COS(($lat * 3.1415) / 180 ) *COS((lng * 3.1415) / 180 - ($lng * 3.1415) / 180 ) ) * 6380 * 1000) as DISTINCE " 
    . " FROM dc_shop WHERE (ACOS(SIN((lat * 3.1415) / 180 ) *SIN(($lat * 3.1415) / 180 ) +COS((lat * 3.1415) / 180 ) * COS(($lat * 3.1415) / 180 ) *COS((lng * 3.1415) / 180 - ($lng * 3.1415) / 180 ) ) * 6380 * 1000) <= $distance "
    . " ORDER BY (ACOS(SIN((lat * 3.1415) / 180 ) *SIN(($lat * 3.1415) / 180 ) +COS((lat * 3.1415) / 180 ) * COS(($lat * 3.1415) / 180 ) *COS((lng * 3.1415) / 180 - ($lng * 3.1415) / 180 ) ) * 6380 * 1000) ASC LIMIT 0,$num@bailin710258  你这个计算量好大呀。@wwwhhhdd  可否写下你用的sql语句呀。网上搜索 了下有两三种写法,不知道用哪个。
      

  9.   

    楼主,你的$distance是以米为单位吗???
      

  10.   


    两位版主,可否对这个SQL语句分析一下。是这里的:http://my.oschina.net/laserdance/blog/40854不知道和:
    SELECT id, name, address, phone, image, (ACOS(SIN((lat * 3.1415) / 180 ) *SIN(($lat * 3.1415) / 180 ) +COS((lat * 3.1415) / 180 ) * COS(($lat * 3.1415) / 180 ) *COS((lng * 3.1415) / 180 - ($lng * 3.1415) / 180 ) ) * 6380 * 1000) as DISTINCE " 
    . " FROM dc_shop WHERE (ACOS(SIN((lat * 3.1415) / 180 ) *SIN(($lat * 3.1415) / 180 ) +COS((lat * 3.1415) / 180 ) * COS(($lat * 3.1415) / 180 ) *COS((lng * 3.1415) / 180 - ($lng * 3.1415) / 180 ) ) * 6380 * 1000) <= $distance "
    . " ORDER BY (ACOS(SIN((lat * 3.1415) / 180 ) *SIN(($lat * 3.1415) / 180 ) +COS((lat * 3.1415) / 180 ) * COS(($lat * 3.1415) / 180 ) *COS((lng * 3.1415) / 180 - ($lng * 3.1415) / 180 ) ) * 6380 * 1000) ASC1、两个SQL语句是不是都对??2、在实际应用中,地球半径你们是取6380还是6371呢????
      

  11.   

    select * From table where  ((lat-你的lat)* (lat-你的lat)+ (long-你的long)*(long-你的long) = 你指定的距离*你指定的距离)