sql >> データベース >  >> RDS >> Mysql

データベースからマーカー半径内に収まる結果を取得します

    これを解くには、次のような円の方程式を理解する必要があります。任意の点(x、y)が中心(x1、y1)および半径r単位の円内にある場合

    (x-x1)^2 + (y - y1)^2 <= r^2
    
    where a^b = a to the power b
    

    この場合、ユーザーB(緯度、経度)は円の中心であり、ユーザーA(緯度、経度)は点(x、y)であり、半径=2kmです。

    しかし、基本的な問題は緯度から経度への変化であるため、ここに解決策があります。1度=111.12kmです。したがって、方程式の両側で単位を同じに保つために、それをKmsに変換します

    したがって、最終的な方程式は次のようになります。

    ((x-x1)*111.12)^2 + ((y-y1)*111.12)^2 = 4      (=2^2) 
    

    同じSQLステートメントは次のようになります

    SELECT A.user_id, A.radius_id, A.latitude, A.logitude
    FROM UserA AS A, 
         (SELECT user_id, latitude, longitude 
           FROM UserB 
           WHERE user_id = 8) AS B
    WHERE (POW((A.latitude-B.latitude)*111.12, 2) + POW((A.longitude - B.longitude)*111.12, 2)) <= 4
    /* **Edit** Here I have used (A.longitude - B.longitude)*111.12, for more accurate results one can replace it with (A.longitude - B.longitude)*111.12*cos(A.latitude)) or (A.longitude - B.longitude)*111.12*cos(B.latitude)) 
    
    And, as i have suggested in the comments that first filter some records based on approximation, so whether one uses A.latitude or B.latitude it will not make much difference */
    

    これがお役に立てば幸いです...



    1. SQLServer2008でトランザクションログを表示する方法

    2. SQLUPDATE文字列CONCATが追加されたフィールドのすべての値が機能しない

    3. PostgreSQLデータベースの作成

    4. メモリ内でのみPostgreSQLを実行する