我正在研究距离某一点一定距离的银行列表
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
然而,我只想抓住每个连锁店的1个场地。
到目前为止的查询
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不起作用,因为它会计算距离不会落入范围内。换句话说,如果有一个距离超过700米的工商银行有较低的身份证,那么即使两个工商银行有700米,工行也不会出现在结果中。所以我怀疑这是因为group by
发生在having
之前
或者可能有不同的解决方案?
我无法将距离检查移动到哪里,因为它不是真正的列#1054 - Unknown column 'distance' in 'where clause'
答案 0 :(得分:1)
选择整个查询作为表,然后执行分组依据。
E.g。
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
答案 1 :(得分:0)
我不确定这是不是您正在寻找的,只是让一家银行距离最短。
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
更改为实际公式。
答案 2 :(得分:0)
您确定您的样本是否完整,因为没有GROUP BY条件?如果你想要700英里范围内的银行,那么把它放在WHERE条件下。如果您只想要报告1个银行,那么将其放入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