0

このGoogle チュートリアルの修正を完了しようとしています

場所の「名前」を使用して場所のテーブルをクエリするために、この SQL を作成しました。場所の名前を指定すると、クエリは近くにあるピザ レストランを返します。これを達成するために、「マーカー」というタイトルのレストランの場所のテーブルをそれ自体にクロス結合し、Haversine 式を使用して距離を計算しました。

    SELECT m.address,
       m.name,
       m.lat,
       m.lng,
       (3959 * ACOS(COS(RADIANS(poi.lat)) * 
       COS(RADIANS(m.lat)) * 
       COS(RADIANS(m.lng) - RADIANS(poi.lng)) + SIN(RADIANS(poi.lat))*
       SIN(RADIANS(m.lat)))) AS distance
    FROM markers poi
       CROSS JOIN markers m
    WHERE poi.address LIKE "%myrtle beach%"
          AND poi.id <> m.id HAVING distance < 200
   ORDER BY distance LIMIT 0,20

クエリは期待どおりの結果を返しますが、対象のポイントが指定されたエリア (この場合は「マートル ビーチ」) の外にある場合、一致ごとに重複したレコードが取得されます。これは、CROSS JOIN が DISTINCT 選択で簡単に修正できるためです。ただし、「lng」フィールドと「lat」フィールドは FLOAT 型であるため、レコードが重複していても、距離の計算が同一になることはありません。

返品のサブセットは次のとおりです。

3901 North Kings Highway Suite 1、マートル ビーチ、サウスカロライナ州 | イースト オブ シカゴ ピザ カンパニー | 33.716099 -78.855583 | 4.0285562196955125

1706 S Kings Hwy # A、マートル ビーチ、サウスカロライナ | ドミノ・ピザ: マートルビーチ | 33.674881 | -78.905144 | 4.0285562196955125

82 ウェントワース ストリート、チャールストン、サウスカロライナ | Andolinis ピザ | 2.782330 | -79.934235 | 85.68177495224947

82 ウェントワース ストリート、チャールストン、サウスカロライナ | Andolinis ピザ | 32.782330 | -79.934235 | 89.71000040441085

114 Jungle Rd、エディスト島、サウスカロライナ | Edisto Beach Inc のバックス ピザ | 32.503971 -80.297951 | 114.22243529200529

114 Jungle Rd、エディスト島、サウスカロライナ | Edisto Beach Inc のバックス ピザ | 32.503971 -80.297951 | 118.2509427998286"

ここからどこへ行くべきかについての提案はありますか?

4

3 に答える 3

1

2 つのポイントがどちらも「マートル ビーチ」に一致するため、結果が重複しています。のような条件を使用して、poi.id < m.id一致を 1 つだけ取得するようにします。

例:

poi id    m id    distance
1         2       100
2         1       100

クエリ:

SELECT 
    m.address,
    m.name,
    m.lat,
    m.lng,
    (3959 * ACOS(COS(RADIANS(poi.lat)) * 
    COS(RADIANS(m.lat)) * 
    COS(RADIANS(m.lng) - RADIANS(poi.lng)) + SIN(RADIANS(poi.lat))*
    SIN(RADIANS(m.lat)))) AS distance
FROM markers poi
CROSS JOIN markers m
WHERE 
    (poi.address LIKE "%myrtle beach%" OR m.address LIKE "%myrtle beach%")
    AND poi.id < m.id 
HAVING distance < 200
ORDER BY distance LIMIT 0,20

または、関心のあるポイントとしてマーカーに特異な行がある場合は、住所の一致ではなく、それを指定します。次に、の条件によりpoi.id <> m.id、重複がないことが保証されます。

SELECT 
    m.address,
    m.name,
    m.lat,
    m.lng,
    (3959 * ACOS(COS(RADIANS(poi.lat)) * 
    COS(RADIANS(m.lat)) * 
    COS(RADIANS(m.lng) - RADIANS(poi.lng)) + SIN(RADIANS(poi.lat))*
    SIN(RADIANS(m.lat)))) AS distance
FROM markers poi
CROSS JOIN markers m
WHERE 
    poi.id = (SELECT TOP(1) id FROM markers WHERE address LIKE "%myrtle beach%")
    AND poi.id <> m.id 
HAVING distance < 200
ORDER BY distance LIMIT 0,20
于 2014-02-22T21:19:04.287 に答える