2015-11-03 45 views
0
SELECT *,round(6378.138*2*asin(sqrt(pow(sin((lat*pi()/180-0*pi()/180)/2),2)+cos(lat*pi()/180)*cos(0*pi()/180)* pow(sin((lng*pi()/180-0*pi()/180)/2),2)))*1000) AS juli  
      FROM `institution` a 
      WHERE round(6378.138*2*asin(sqrt(pow(sin((lat*pi()/180-0*pi()/180)/2),2)+cos(lat*pi()/180)*cos(0*pi()/180)* pow(sin((lng*pi()/180-0*pi()/180)/2),2)))*1000)<1000000 
      ORDER BY juli ASC 
      LIMIT 10 

我认为这是不好的。任何建议?我需要一些建议来改变我的sql

+0

查询应该做什么?它究竟在做什么? –

+0

@LukasKabrt:它似乎在计算两个地理位置之间的某种大圆距离(如lat/lng变量和trig函数所示)。 – 0x24a537r9

回答

0

你有很多0*x操作,这显然不利于事情的。我会先简化一下。此外,您似乎正在做很多deg->rad转换,可能可以通过首先将数据存储在弧度中来改进。

+0

这只是一个例子,我存储'lng''lat',我想查找距离范围内的地方 –

+0

当然,但您仍然可以将lat/lng转换为弧度以节省一些周期和查询复杂度。我仍然不明白你为什么需要0 * x操作。 – 0x24a537r9

+0

我不知道如何转换,0不过是一个测试,我没有一个真正的地理位置信息。 –

0

我认为它看起来很不错,但只有没有必要ASC用途: -

ORDER BY juli 
+0

难道你不认为使用两次不好吗? –