Mysql 如何搜索半径为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 ...

我正在尝试选择半径为5公里的活动,并根据喜好从最老到最新进行排序。我知道如何选择活动并按喜好排序,但我搞不懂这一点。问题可能是位置存储在不同的表中

数据库结构:

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
。推广使用explict
JOIN
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