【发布时间】:2026-02-10 14:30:01
【问题描述】:
我正在获取距某个点一定距离的银行列表
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
按名称使用组不起作用,因为它评估然后距离不落入范围内。换句话说,如果有一个 ICBC 超过 700 m 并且具有较低的 id,那么即使两个 ICBC 在 700 m 以内,ICBC 也不会出现在结果中。所以我怀疑发生这种情况是因为group by 发生在having 之前
或者也许有不同的解决方案?
我无法将距离检查移到 where 因为它不是真正的列 #1054 - Unknown column 'distance' in 'where clause'
【问题讨论】:
-
HAVING是在GROUP BY之后执行的。这正是它被发明的目的。如果你需要对结果集应用一些条件之前GROUP BY你需要使用WHERE -
如果你的意思是`抓住每条链的1个场地`,那是指最近的一个吗?
-
@zerkms 但是距离列不存在。我还能如何在给定距离内找到动态的银行?在这种情况下 WHERE 不起作用?
-
@ace 最好,但不如一个重要
-
@Moak:将评估放在
where子句中