如何搜索半径 5 公里内的事件

How to search for events in 5 km radius

我正在尝试 select 5 公里半径内的活动,并按喜欢程度从最旧到最新对它们进行排序。我知道如何 select 事件并按喜欢对它们进行排序,但我无法弄清楚这一点。问题可能是该位置存储在不同的 table.

数据库结构:

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

开头的大栏是使用纬度和经度计算事件与用户位置的距离。

这是我从 SQL 调试器得到的:

#1054 - Unknown column 'distance' in 'where clause'

有人知道怎么做吗?

$latitudeD= latitude;
$longitudeD = longitude;

SELECT event,
        SQRT(
            POW(69.1 * (coordX - $latitudeD), 2) +
            POW(69.1 * ($longitudeD - coordY) * COS(coordX / 57.3), 2)) AS distance
        FROM db.table WHERE SQRT(
            POW(69.1 * (coordX - $latitudeD), 2) +
            POW(69.1 * ($longitudeD - coordY) * COS(coordX / 57.3), 2))  < 50 ORDER BY distance
        ;

很难追踪错误的地方,你应该先尝试解决距离部分。

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 

然后加入回eventtable

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

顺便说一句,这个 group_by 会给你带来 event_id 加上 e.* 的随机值,所以要小心