1

我正在获取与某个点有一定距离的银行列表

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'

4

3 回答 3

2

选择您的整个查询作为表格,然后对其执行 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-10T23:36:23.017 回答
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 
于 2011-08-10T23:48:54.550 回答
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

编辑:将distancewhere 子句中的更改为实际公式。

于 2011-08-10T23:41:02.883 回答