php+sql搜索附近店铺的sql语句怎么写?

wwwhhhdd 2014-04-07 10:40:46
情况是这样的,数据库里存储着大量的店铺经纬度及送货距离,现在要通过一个经纬度查找附近能送达的店铺信息。这个sql条件怎么写?百度了下,找到的都是固定了送货距离也就是固定了范围的写法,对于每个店铺送货距离都不一样的情况则貌似还没有好的解决办法。请高手指教
...全文
811 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
lincong009 2015-01-08
  • 打赏
  • 举报
回复
select * From table where ((lat-你的lat)* (lat-你的lat)+ (long-你的long)*(long-你的long) = 你指定的距离*你指定的距离)
看小雪 2015-01-04
  • 打赏
  • 举报
回复
$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语句呀。 网上搜索 了下有两三种写法,不知道用哪个。
xuzuning 2015-01-04
  • 打赏
  • 举报
回复
6380km 地球的平均半径
引用 22 楼 bluewjzhhr 的回复:
[quote=引用 11 楼 xuzuning 的回复:] 对于 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 指令前计算好 因此在查询时的计算量并不算大,只是多用了几个字段
版主,最近要做一个“附近的商店”,对你这个算法不是很理解,可否详细说下?特别是那个6380是什么意思?? 我数学不好,尽可能的详细些。[/quote]
傲雪星枫 2015-01-04
  • 打赏
  • 举报
回复
經緯度。
看小雪 2015-01-04
  • 打赏
  • 举报
回复
引用 5 楼 u011561479 的回复:
百度一下不就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
这个搜索 来的,6378.138, 22.546125,113.941072都各自代表什么意思呀???
看小雪 2015-01-04
  • 打赏
  • 举报
回复
引用 11 楼 xuzuning 的回复:
对于 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 指令前计算好 因此在查询时的计算量并不算大,只是多用了几个字段
版主,最近要做一个“附近的商店”,对你这个算法不是很理解,可否详细说下?特别是那个6380是什么意思?? 我数学不好,尽可能的详细些。
看小雪 2015-01-04
  • 打赏
  • 举报
回复
引用 25 楼 xuzuning 的回复:
select * from location where sqrt( ( ((113.914619-longitude)*PI()*12656*cos(((22.50128+latitude)/2)*PI()/180)/180) * ((113.914619-longitude)*PI()*12656*cos (((22.50128+latitude)/2)*PI()/180)/180) ) + ( ((22.50128-latitude)*PI()*12656/180) * ((22.50128-latitude)*PI()*12656/180) ) )<2
引用 24 楼 fdipzone 的回复:
經緯度。
两位版主,可否对这个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) ASC 1、两个SQL语句是不是都对?? 2、在实际应用中,地球半径你们是取6380还是6371呢????
看小雪 2015-01-04
  • 打赏
  • 举报
回复
楼主,你的$distance是以米为单位吗???
wwwhhhdd 2014-04-09
  • 打赏
  • 举报
回复
加了字段,又在sql里先WHERE了A点经纬度+-0.1之间,现在计算的速度很不错,对服务器压力也挺小的,算是解决比较理想了。再次感谢版主xuzuning和飞舞的锄头的热心指教。
李睿_Lee 2014-04-08
  • 打赏
  • 举报
回复
不要在查询里计算,这样效率会很差,先计算好条件需要的数据,再拼装查询SQL
wwwhhhdd 2014-04-08
  • 打赏
  • 举报
回复
这样是不是效率非常底下?如果数据量到一定的当量是不是执行这样一个查询会很费时间?一天查询量再大些的话服务器会不会受不了?是不是先在条件里加个范围初步筛选出一部分后再进行比对合理点?
飞舞的锄头 2014-04-08
  • 打赏
  • 举报
回复
直接根据距离也行
	$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
飞舞的锄头 2014-04-08
  • 打赏
  • 举报
回复
引用 3 楼 wwwhhhdd 的回复:
比如现在有个点A($lat=1111.111,$lng=2222.222),数据库中有N个点类似B(包含lat,lng2个字段),以及送货距离sendmeter字段。 请问怎么写sql语句,把AB2点距离在送货距离之内的店铺都找出来?
把店铺信息表里的送货距离送货距离换算成经纬度范围,查询时查询A点是否在B的送货范围之内
csdn醒哥 2014-04-08
  • 打赏
  • 举报
回复
百度一下不就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
wwwhhhdd 2014-04-08
  • 打赏
  • 举报
回复
请大神抽空指教下啊。
wwwhhhdd 2014-04-08
  • 打赏
  • 举报
回复
非常感谢版主热心指导。我按照这个思路去做一下。有什么问题还会来请教的。 万分感谢!!
xuzuning 2014-04-08
  • 打赏
  • 举报
回复
增加字段是必须的,这是用空间换时间的做法 不然每次都计算势必效率很低
wwwhhhdd 2014-04-08
  • 打赏
  • 举报
回复
哦,刚才说错了,是套红的部分无法实现计算的。难道要在数据库里单独弄些字段,在入库前就计算好套红部分的值?
wwwhhhdd 2014-04-08
  • 打赏
  • 举报
回复
没有啊,我这里只有一个A点的经纬度。要从数据库里搜索所有距离A点小于送货距离的点
xuzuning 2014-04-08
  • 打赏
  • 举报
回复
$lat 和 $lng 不是传入的变量吗?就是指定的店铺的经纬度啰 实际上是以店铺名从表中查到的呀
加载更多回复(6)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧