2016-08-12 3 views
-2

latitudelongitude의 두 테이블 사용자 및 장소가 있습니다. 각 장소에 대해 x 거리 내에있는 사용자를 합산하려고합니다.거리 테이블에 따른 MySQL 합계

이렇게하는 한 가지 가능한 방법은 루핑입니다. 그것을 할 다른 방법이 있습니까? 어떻게 이것을 평범하게 SQL에서 얻을 수 있습니까?

편집 :

User(id, name, latitude, longitude) 

Place(id, name, latitude, longitude) 
+1

테이블 구조를 제공하여 관련성을 이해할 수 있도록해야하지만 아니요. 고리. 'join'과'count'는 여러분이 찾고있는 것입니다. – sgeddes

+0

https://dev.mysql.com/doc/refman/5.7/en/spatial-extensions.html – Nicarus

+1

MySQL GIS 확장에 대한 조사를 수행하십시오. –

답변

0

크로스 각 장소에 유사한 각 "사용자"와 "사용자"및 "위치"(조인 될 하나 개의 접근법 같아 사이의 거리를 계산하는 식을 통합한다. "user"lat/long과 "place"lat/long (GCD)을 비교하여 표현식의 결과를 주어진 거리 "x"와 비교하고 비교 결과에 따라 0 또는 1을 반환합니다. SUM 집계 비교에서 되돌아왔다.

SELECT p.id 
    , p.name 
    , IFNULL(SUM([gcd_expr] <= x) ,0) AS cnt 
    FROM place p 
CROSS 
    JOIN user u 
GROUP BY p.id 

모든 사용자가 모든 장소와 일치하면 정말 큰 세트가 될 수 있습니다. 엄청나게 비쌀 수도있는 거리를 계산해야합니다. 성능 향상을 위해

, 우리는 당신은 위도 5도 내에있는 사용자를 확인하고 싶은 말은 ... 위도 및/또는 경도의 델타를 제한 Join 술어 포함 할 수있다를 ...

SELECT p.id 
    , p.name 
    , IFNULL(SUM([gcd_expr] <= x) ,0) AS cnt 
    FROM place p 
    LEFT 
    JOIN user u 
    ON u.lat-p.lat BETWEEN -5.00 AND 5.00 
GROUP BY p.id 

[gcd_expr]은 Great Circle Distance 계산을 수행하는 표현식을 나타냅니다. StackOverflow에 대한 기존 질문을 검색하면 해당 질문에 대한 답변이 여러 번 나온다는 것을 알고 있습니다.