2012-04-08 29 views
0

lat, lngを使用する既存のSQLクエリと、より大きな円の式を使用して、特定のリストを中心に半径1km以内のすべてのリストを計算しました。ポイント周辺の距離を検索する(MBRcontainsを使用)

これはうまく動作しますが、MySQL Geospatial拡張機能を使用して速度を上げ、円ではなくMBR矩形を使用しています。

問題:MBRcontainsを使用する新しいコードはゼロの結果を返します。私はSQLクエリの何かを見逃しましたか?

Lat: 42.353443 Lng: -71.076584

旧SQLクエリ

SELECT `price`, `city`, `state` FROM (`listings`) 
WHERE `bedroom` = '1' 
AND `post_timestamp` BETWEEN DATE_SUB(NOW(), INTERVAL 10 DAY) AND DATE_SUB(NOW(), INTERVAL 0 DAY) 
AND (6371 * acos(cos(radians(listings.lat)) * cos(radians(42.353443)) * cos(radians(-71.076584) - radians(listings.lng)) + sin(radians(listings.lat)) * sin(radians(42.353443)))) < 1 
LIMIT 100 

新しいSQLクエリFormula

SELECT `price`, `city`, `state` FROM (`listings`) 
WHERE `bedroom` = '1' 
AND `post_timestamp` BETWEEN DATE_SUB(NOW(), INTERVAL 10 DAY) AND DATE_SUB(NOW(), INTERVAL 0 DAY) 
AND MBRContains( 
    LineString(Point(42.353443 + 1/(111.1/COS(RADIANS(-71.076584))), 42.353443 + 1/111.1), 
          Point(-71.076584 - 1/(111.1/COS(RADIANS(42.353443))), 42.353443 - 1/111.1)) 
          , p) 
) 
LIMIT 100 

答えて

2

私はあなたがこのSQLを試すことができると思います:

SELECT `price`, `city`, `state` FROM (`listings`) 
    WHERE `bedroom` = '1' 
    AND `post_timestamp` BETWEEN DATE_SUB(NOW(), INTERVAL 10 DAY) AND DATE_SUB(NOW(), INTERVAL 0 DAY) 
    AND MBRContains( 
      LineString( 
         Point(
          42.353443 + 1/(111.1/COS(RADIANS(-71.076584))), 
          -71.076584 + 1/111.1), 
         Point(
          42.353443 - 1/(111.1/COS(RADIANS(-71.076584))), 
          -71.076584 - 1/111.1) 
          ) 
      , p) 
    ) 
    LIMIT 100 

私はlat-lonの位置を変更しました。

関連する問題