2011-06-29 39 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 

这给了我每个城市的一个记录,用最大/最小值我问,但那些最小值和最大值代表了最小纬度,最大个体查询纬度等...这给了我一个相当不错的地区估计,所以我可以在Google Map上画一个多边形......但它们是正方形,并且有很多重叠,我知道我可以使这个更好。这些结果代表城市记录组中的任意一条记录的北,南,东,西最大值。

我想要做的是搜索一条记录,其中h作为最大纬度和最大纵向值,然后是最大纬度和最小纵向值...等。

不知道如何嵌套这些SQL语句......我尝试了一些IN语句,但总是导致一个记录不完全代表任何最大值或最小值。

回答

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) 

或两个

(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

为了进一步说明这个问题:不是有四个结果,最大的经纬,以及最低纬度和一系列的城市分组坐标的纵向价值....我想四条记录;谁拥有最大的纬度和经度坐标的城市,谁拥有最大的纬度和最小纵向协调全市,谁拥有最低纬度和最小纵向协调全市,并具有最小的纬度和最大纬度坐标的城市。 –

+0

你可以随心所欲多次联合。如果你有菱形定位,你必须在坐标上进行选择并选择一个 – Fabrizio

0
混合

我想做什么,是搜索一个记录,其中哈哈s最大纬度和最大纵向值

但是几乎肯定不会有一个记录同时具有最大经度和最大长度。当一个地方进一步向北而另一个地方进一步向东时,您期望的结果是什么?

你在寻找每个城市'最北部东部'的地方吗?在这种情况下:

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

和类似地用MIN和/或lat-lng为其他对角线方向。

为了获得每个城市最北部的东西,你有'每组最大'的问题,这是一个常见的SQL麻烦。参见例如this question进行讨论。最东北风就地每城市的一个例子:

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这样可能效率低下,除非你真正的纬度+ LNG添加一个索引列。

然后,你必须试图满足所有四个查询(东北,东南,西南和西北版本)到同一个查询的问题。解决此问题的最佳方法通常不是:执行四个单独的查询。通常情况下,您尝试将四个单独的操作压缩到一个查询中时出现的各种扭曲会给您带来效率低下且比四个单独查询更不可读的问题。

在任何情况下,我真的没有看到任何地方这让你。如果您试图在一组地图点上绘制最小的非矩形多边形,则必须选择城市的每个点并使用convex hull algorithm或某种四叉树。在SQL中涉及太多。