2011-06-29 5 views
0

これが論理質問かMySQL質問かどうかは分かりませんが、依然として助けが必要です。地理座標のMySQLネストされたステートメント

私は領域のリストを持っており、それぞれに座標があります。データベースのサイズは約115MBです。ここでは、レコードのサンプリングです:私がする必要がどのように

| PC1 | PC2 | CITY | PROV | AREACODE | LAT  |  LNG  | 
| A1A | 0B8 | ST. JOHNS | NL | 709 |47.5986880000|-52.7255210000| 
| A1A | 0B9 | ST. JOHNS | NL | 709 |47.5505750000|-52.7460720000| 

、および等々...

、最大緯度経度値を表し、各都市のレコードを取得することです次に、最大緯度の最小経度値、次に最小緯度値の最小縦値のレコード、次に最小緯度値の最大縦値のレコード。私が始めた何

た:

SELECT MAX(lat), MAX(lng), MIN(lat), MIN(lng), city FROM places GROUP BY city 

これは、私は尋ねたが、それらの最小値と最大値、最小緯度のために個々のクエリを表し、最大MAX/MIN値で、私に都市ごとに一つのレコードを与えました緯度などが含まれているため、Googleマップ上に多角形を描くことができるように、領域の推定値がかなりわかりました。しかし、それらは四角形で、オーバーラップがたくさんあります。これらの結果は、市のレコード群のいずれのレコードの北、南、東、西の最大値を表します。

私がしたいのは、これらのSQLステートメントをネストする方法がわかりません...私はいくつかのINステートメントを試しましたが、いつも結果が出ました。 1つのレコードは最大値または最小値のいずれも全く表さなかった。

答えて

0

私が正しくあなたの質問を理解していますが、HAVING句

SELECT lat, lng, city FROM places GROUP BY city HAVING lat=MAX(lat) 

またはUNION

(SELECT MAX(lat), MAX(lng), city FROM places GROUP BY city) 
UNION 
(SELECT MAX(lat), MIN(lng), city FROM places GROUP BY city) 

または2

(SELECT MAX(lat), MAX(lng), city FROM places GROUP BY city HAVING lat=MAX(lat)) 
UNION 
(SELECT MAX(lat), MIN(lng), city FROM places GROUP BY city HAVING lng=MIN(lng)) 
+0

さらに4つの結果を示す代わりに、都市別にグループ化された一連の座標の最大緯度および経度、最小緯度および経度の値.... 4つの記録が必要です。最大緯度および経度座標を有する都市、緯度および経度の最大座標を有する都市、緯度および経度の最小座標を有する都市、および緯度および経度の最小座標を有する都市を含む。 –

+0

あなたは何回でもUNIONを行うことができます。あなたは菱形の位置を持っている場合には、索引で遊んで、普及しているものを選ぶ必要があります – Fabrizio

0
のミックスに見ることができるかどうか確認してくださいません

私がしたいことは、最大緯度と最大の縦方向の値を持つ緯度および経度の最大値

しかし、ほとんどの場合、max latとmax longの両方を持つレコードは1つありません。 1つの場所がさらに北になり、別の場所がさらに東にある場合、あなたの望む結果は何ですか?

都市ごとに「最も北東」の場所をお探しですか?場合:他の対角線方向に対するMIN及び/又はlat-lng

SELECT * FROM places WHERE city='ST. JOHNS' 
ORDER BY MAX(lat+lng) DESC LIMIT 1; 

と同様。

各都市で最も北東に行くには、「グループごとに最大」という問題があります。これは一般的なSQLの問題です。説明は例えばthis questionを参照してください。最も北東 - 場所あたりの都市の例:あなたが実際に緯度+ LNGのためのインデックス付きの列を追加しない限り

SELECT p0.* 
FROM places AS p0 
LEFT JOIN places AS p1 ON p1.city=p0.city AND p1.lat+p1.lng>p0.lat+p0.lng 
WHERE p1.city IS NULL 

しかしこれらの計算された次のクエリは非常に可能性の高い非効率的unindexableです。

次に、4つのクエリ(NE、SE、SW、NWのすべてのバージョン)を同じクエリに適合させるという問題があります。この問題を解決する最善の方法は、通常は次のようなものではありません。通常、4つの別々の操作を1つのクエリに絞り込むことになるさまざまな歪みは、4つの個別のクエリより効率が低く、読みにくいものになります。

いずれにしても、私が実際にどこにいるのかわかりません。マップポイントの周りに最小限の長方形以外のポリゴンを描画する場合は、都市のすべてのポイントを選択し、convex hull algorithmまたは何らかのクォードツリーを使用する必要があります。 SQLではやりすぎです。

関連する問題