Mysql 如何搜索半径为5公里的事件
我正在尝试选择半径为5公里的活动,并根据喜好从最老到最新进行排序。我知道如何选择活动并按喜好排序,但我搞不懂这一点。问题可能是位置存储在不同的表中 数据库结构:Mysql 如何搜索半径为5公里的事件,mysql,join,latitude-longitude,Mysql,Join,Latitude Longitude,我正在尝试选择半径为5公里的活动,并根据喜好从最老到最新进行排序。我知道如何选择活动并按喜好排序,但我搞不懂这一点。问题可能是位置存储在不同的表中 数据库结构: event plusone (like) location id_event id_plusone id_location location_id event_id lat ... user_id lon ...
event plusone (like) location
id_event id_plusone id_location
location_id event_id lat
... user_id lon
... city_id
full_name
....
我正在尝试的SQL语句:
SELECT 3956 * 2 * ASIN(
SQRT(POWER(SIN((50.127946 - abs(l.lat)) * pi()/180 / 2),2) + COS(50.127946 * pi()/180 ) *
COS(abs(l.lat) * pi()/180) * POWER(SIN((14.4882912 - l.lon) * pi()/180 / 2), 2) )) AS distance,e.*,COUNT( p.id_plusone ) AS
likes
FROM
event e,location l
LEFT JOIN plusone p ON p.event_id = e.id_event
WHERE
e.location_id = l.id_location AND distance<=5 GROUP BY e.id_event
ORDER BY e.timestamp DESC,likes DESC
选择3956*2*ASIN(
SQRT(功率(SIN((50.127946-abs(l.lat))*pi()/180/2),2)+COS(50.127946*pi()/180)*
COS(abs(l.lat)*pi()/180)*功率(SIN((14.4882912-l.lon)*pi()/180/2),2))作为距离,e.*,计数(p.id_plusone)作为
喜欢
从…起
事件e,位置l
在p.event\u id=e.id\u event上左连接plusone p
哪里
e、 位置id=l.id位置和距离$latitudeD=纬度;
$longitudded=经度;
选择事件,
SQRT(
战俘(69.1*(coordX-$latitudeD),2)+
功率(69.1*($longituted-coordY)*COS(coordX/57.3),2))作为距离
来自db.table,其中SQRT(
战俘(69.1*(coordX-$latitudeD),2)+
功率(69.1*($longitudded-coordY)*COS(coordX/57.3),2))<50个距离阶
;
很难跟踪错误的位置,您应该首先尝试解决距离部分
SELECT
event_id,
3956 * 2 * ASIN(SQRT( POWER(SIN((50.127946 - abs(l.lat)) * pi()/180 / 2),2)
+ COS(50.127946 * pi()/180 ) * COS(abs(l.lat) * pi()/180) * POWER(SIN((14.4882912 – l.lon) * pi()/180 / 2), 2) )) AS distance,
FROM event e
JOIN location l
WHERE distance <= 5
顺便说一句,这个groupby
将为您带来event\u id
以及e.*
的随机值,因此请小心不要将与旧的和过时的合并,其中a.id=b.id
。推广使用explictJOIN
sintaxis,Aaron Bertrand写了一篇很好的文章。在我看来,你使用了错误的破折号(–
,而不是-
),字符看起来可疑。我认为应该是-
,所以你有一个长破折号而不是标准的减号。顺便说一句,你知道mysql有空间数据类型和函数吗?是的,它是“-”字符;但是它仍然不起作用,我会更新这个问题。如果一个问题得到了回答,但是一个新问题出现了,那么你不应该编辑这个问题,而应该关闭这个问题并发布一个新问题。为什么你要将php混合到这个问题中?嗨,我按照你的建议,它现在正在工作,所以谢谢:)
SELECT
event_id,
3956 * 2 * ASIN(SQRT( POWER(SIN((50.127946 - abs(l.lat)) * pi()/180 / 2),2)
+ COS(50.127946 * pi()/180 ) * COS(abs(l.lat) * pi()/180) * POWER(SIN((14.4882912 – l.lon) * pi()/180 / 2), 2) )) AS distance,
FROM event e
JOIN location l
WHERE distance <= 5
SELECT e.*, count(p.id_plusone)
FROM event e
LEFT JOIN plusone p
ON p.event_id = e.id_event
JOIN ( Previous Distance Query) d
ON e.event_id = d.event_id
GROUP BY e.id_event
ORDER BY e.timestamp DESC, likes DESC