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

WHERE句を使用して、経度と緯度からの距離の範囲内でPOIを検索します

    問題は、エイリアス列(distance)を参照できないことです。 この場合)select またはwhere 句。たとえば、これを行うことはできません:

    select a, b, a + b as NewCol, NewCol + 1 as AnotherCol from table
    where NewCol = 2
    

    これは両方で失敗します:select NewCol + 1を処理しようとしたときのステートメント また、where NewCol = 2を処理しようとしたときのステートメント 。

    これを解決するには2つの方法があります:

    1)参照を計算値自体に置き換えます。例:

    select a, b, a + b as NewCol, a + b + 1 as AnotherCol from table
    where  a + b = 2
    

    2)外側のselectを使用します ステートメント:

    select a, b, NewCol, NewCol + 1 as AnotherCol from (
        select a, b, a + b as NewCol from table
    ) as S
    where NewCol = 2
    

    さて、あなたの巨大であまり人間に優しい計算された列を考えると:)私はあなたが読みやすさを改善するために最後のオプションに行くべきだと思います:

    SET @orig_lat=55.4058;  
    SET @orig_lon=13.7907; 
    SET @dist=10;
    
    SELECT * FROM (
      SELECT 
        *, 
        3956 * 2 * ASIN(SQRT(POWER(SIN((@orig_lat -abs(latitude)) * pi()/180 / 2), 2) 
        + COS(@orig_lat * pi()/180 ) * COS(abs(latitude) * pi()/180) 
        * POWER(SIN((@orig_lon - longitude) * pi()/180 / 2), 2) )) as distance 
      FROM geo_kulplex.sweden_bobo
    ) AS S
    WHERE distance < @dist
    ORDER BY distance limit 10;
    

    編集: @Kaiiが以下で説明するように、これは全表スキャンになります。処理するデータの量によっては、それを避けて、より高速に実行される最初のオプションを選択することをお勧めします。



    1. 配列を1レベルずつネスト解除します

    2. MySQLデータベースのバックアップを取り、Cronタブを使用して毎晩Amazon s3に配置する方法は?

    3. バイナリとしてのUUIDの挿入と選択(16)

    4. PostgreSQLで既存のテーブルに自動インクリメントの主キーを追加するにはどうすればよいですか?