2

私は次のようなテーブルを持っています:-

表:お得な情報
+ ---- + ------- + ---------- + ---------- + ------------ +
| ID | 名前| 緯度| 経度| end_date |
| ---- + ------- + ---------- + ---------- + ------------ +
| 1 | ピザ| 10.5 | -10.5 | 2012-12-12 |
| 2 | ピザ| 11.5 | -10.5 | 2012-12-12 |
| 3 | ゼリー| 21.5 | -10.5 | 2012-12-12 |
| 4 | ゼリー| 23.5 | -10.5 | 2012-12-12 |
| 5 | ユリ| 19.5 | -10.5 | 2012-12-12 |
+ ---- + ------- + ---------- + ---------- + ------------ +

私はとを使用して、latitudeそのlongitude人までの距離を見つけています。DISTINCTしかし、結果はに基づく必要がありnameます。また、計算した距離で結果を並べ替えて、制限0.3を適用する必要があります。

私が現在使用しているクエリは"-

SELECT *,
   ( 6371 * Acos(Cos(Radians(9.939625)) * Cos(Radians(lat)) * Cos(
                               Radians(lng) - Radians(76.259498)) +
                          Sin(Radians(9.939625)) * Sin(Radians(lat))) ) AS
   distance
FROM   deals
WHERE  1
   AND end_date >= Now()
HAVING distance < 20000
ORDER  BY id DESC,
      distance
LIMIT  0, 3;  

つまり、私が必要としているのは次のとおりです。

  1. 最も近い取引のリスト(距離でソート)
  2. に区別して適用しますname(ピザとゼリーの両方が1回だけ表示されるように)
4

2 に答える 2

2

MIN名前ごとの最小距離、GROUP BY名前 (名前ごとに 1 つの結果が得られます) およびORDER BY最初に距離を取得し、後で idを取得するために適用する必要があります。

SELECT *,
   MIN( 6371 * Acos(Cos(Radians(9.939625)) * Cos(Radians(latitude)) * Cos(
                               Radians(longitude) - Radians(76.259498)) +
                          Sin(Radians(9.939625)) * Sin(Radians(latitude))) ) 
AS distance
FROM   deals
WHERE  end_date >= Now()
GROUP BY name
ORDER  BY distance, id DESC

このクエリはあなたの場合には問題ないかもしれませんが、一般的にはあまり役に立ちません。たとえば、最寄りのピザ店の緯度と経度を知りたい場合は、まったく別のクエリが必要になるためです。

于 2012-09-07T12:49:10.993 に答える
0
SELECT *, 
   ( 6371 * Acos(Cos(Radians(9.939625)) * Cos(Radians(lat)) * Cos( 
                               Radians(lng) - Radians(76.259498)) + 
                          Sin(Radians(9.939625)) * Sin(Radians(lat))) ) AS 
   distance 
FROM   deals 
WHERE  1 
   AND end_date >= Now() 
GROUP BY name
HAVING distance < 20000 
ORDER  BY id DESC, 
      distance 
于 2012-09-07T12:46:20.853 に答える