我正在获取一个离某个点有一定距离的银行列表
ICBC 6805 119.86727673154
Bank of Shanghai 7693 372.999006839511
Bank of Ningbo 7626 379.19406334356
ICBC 6790 399.580754911156
Minsheng Bank 8102 485.904900718796
Standard Chartered Bank 8205 551.038506011767
Guangdong Development Bank 8048 563.713291030103
Bank of Shanghai 7688 575.327270234431
Bank of Nanjing 7622 622.249663674778然而,我只想抓取每个链条的一个地点。
到目前为止查询
SELECT name, id , (
GLength( LineStringFromWKB( LineString( `lnglat` , POINT( 121.437478728836, 31.182877821277 ) ) ) )
) *95000 AS `distance`
FROM `banks`
WHERE (
lnglat != ""
)
AND (
published =1
)
HAVING (
distance <700
)
ORDER BY `distance` ASC使用group by name不起作用,因为它计算的结果是距离不在该范围内。换句话说,如果有一家工商银行在700米之外,id较低,那么即使两家工商银行的id为700米,工行也不会出现在结果中。所以我怀疑这是因为group by发生在having之前
或者也许有不同的解决方案?
我无法将距离检查移动到where,因为它不是真正的列#1054 - Unknown column 'distance' in 'where clause'
发布于 2011-08-11 07:36:23
选择整个查询作为一个表,然后对其执行Group By。
例如。
Select * FROM
(SELECT name, id , (
GLength( LineStringFromWKB( LineString( `lnglat` , POINT( 121.437478728836, 31.182877821277 ) ) ) )
) *95000 AS `distance`
FROM `banks`
WHERE (
lnglat != ""
)
AND (
published =1
)
HAVING (
distance <700
)
ORDER BY `distance` ASC) t
GROUP BY t.name发布于 2011-08-11 07:41:03
我不确定这是否是你要找的,只是找一家距离最短的银行。
SELECT banks.name, banks.id, banks_with_least_distance.distance
FROM banks JOIN
(
SELECT name, min(
GLength( LineStringFromWKB( LineString( `lnglat` , POINT( 121.437478728836, 31.182877821277 ) ) ) )
*95000) AS `distance`
FROM `banks`
WHERE (lnglat != "") AND (published =1) AND (GLength( LineStringFromWKB( LineString( `lnglat` , POINT( 121.437478728836, 31.182877821277 ) ) ) ) *95000 < 700)
GROUP BY `name`
) AS banks_with_least_distance ON banks.name = banks_with_least_distance.name
ORDER BY banks_with_least_distance.distance DESC已编辑:将where子句中的distance更改为实际公式。
发布于 2011-08-11 07:48:55
您确定您的样本是完整的,因为没有分组依据条件?如果你想要700英里内的银行,那就把它放在WHERE条件下。如果你只想要一家银行的报告,那就把它放在GROUP BY中。您可能需要在Group By中重复Glenght,而不是使用别名-这取决于您的SQL版本。您不是从某个点获取某个特定距离的银行列表--您是通过位置获取银行,并计算离某个点的距离。您只需要计算距离为700的银行,如果一家银行重复,您只希望它列出一次。
SELECT name, id, (GLength( ...) AS [distance]
FROM [banks]
WHERE [lnglat] != "" ... AND [distance] <700
Group By [name], [id], [distance]
ORDER BY [distance] ASC https://stackoverflow.com/questions/7019174
复制相似问题