首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何确保在GROUP BY之前发生

如何确保在GROUP BY之前发生
EN

Stack Overflow用户
提问于 2011-08-11 07:28:12
回答 3查看 3.5K关注 0票数 1

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

代码语言:javascript
运行
复制
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

然而,我只想抓取每个链条的一个地点。

到目前为止查询

代码语言:javascript
运行
复制
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'

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-11 07:36:23

选择整个查询作为一个表,然后对其执行Group By。

例如。

代码语言:javascript
运行
复制
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
票数 2
EN

Stack Overflow用户

发布于 2011-08-11 07:41:03

我不确定这是否是你要找的,只是找一家距离最短的银行。

代码语言:javascript
运行
复制
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更改为实际公式。

票数 0
EN

Stack Overflow用户

发布于 2011-08-11 07:48:55

您确定您的样本是完整的,因为没有分组依据条件?如果你想要700英里内的银行,那就把它放在WHERE条件下。如果你只想要一家银行的报告,那就把它放在GROUP BY中。您可能需要在Group By中重复Glenght,而不是使用别名-这取决于您的SQL版本。您不是从某个点获取某个特定距离的银行列表--您是通过位置获取银行,并计算离某个点的距离。您只需要计算距离为700的银行,如果一家银行重复,您只希望它列出一次。

代码语言:javascript
运行
复制
    SELECT name, id, (GLength( ...) AS [distance]
    FROM [banks] 
    WHERE [lnglat] != "" ... AND [distance] <700 
    Group By [name], [id], [distance] 
    ORDER BY [distance] ASC 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7019174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档