2016-12-06 25 views
0

私はmysqlテーブルで2緯度と2経度を使用しています。いくつかのレコードが複数の場所を持つため、私は緯度と経度の両方のレコードを結合しています。しかし、UNIONを使用してレコードを結合する際には、以前に作成された重複レコードがいくつか作成されます。だから、重複レコードを避ける方法。誰かが私を助けてくれますか?UNIONを使用して重複レコードを削除する方法

重複するレコードの作成方法。 たとえば、2つの場所の距離が1つのレコード500km、ただし、HAVING距離を500km以上使用している場合。緯度は記録を一度引っ張り、感謝は記録を一度引っ張る。 2つのレコードを得ることができます。だから、これが問題です。

SELECT * , (6371 * acos(cos(radians($Latitude)) * cos(radians(latitude)) * cos(radians(longitude) - radians($Longitude)) + sin(radians($Latitude)) * sin(radians(latitude)))) AS distance 
FROM mytable 
HAVING distance < $Distance 

     UNION DISTINCT 

SELECT * , (6371 * acos(cos(radians($Latitude)) * cos(radians(latitude1)) * cos(radians(longitude1) - radians($Longitude)) + sin(radians($Latitude)) * sin(radians(latitude1)))) AS distance 
     FROM mytable 
HAVING distance < $Distance 
ORDER BY distance 
+1

デフォルトでUNIONはDISTINCTです。サンプルデータを提供できますか?重複した行が本当にありますか? – Dekel

+0

あなたは 'UNION'同じテーブルですが、これのポイントは何ですか? –

+0

はい、これは緯度から来て、同じレコードが再びlatitude1によって返されます –

答えて

0

UNION DISTINCTは、行全体を比較する。それにはdistanceが含まれます。しかし、私があなたの説明を理解すれば、2つの距離は異なる可能性があります。

プランA:距離を返さない:

(SELECT * FROM tbl 
     WHERE (big-long-forumula) < $Distance) 
UNION DISTINCT 
(SELECT * FROM tbl 
     WHERE (other formula) < $Distance) 

プランB:使用OR

SELECT *, 
     (...) AS distance1, 
     (...) AS distance2 
    FROM tbl 
    HAVING distance1 < $Distance 
     OR distance2 < $Distance 

(どちらもあなたがスキャンする行の数千を持っている場合は特に、 '速い' になります。)

+0

プランBは重複IDを作成しません。ありがとう、ありがとう、ありがとう。 –

+0

私はあなたの答えを目盛りで受け入れました。ありがとう。 –

+0

あなたのsqlは2行を提供します。私のプランBはあなたに一列に2つの距離を与えます。 –

関連する問題